Spec-Zone.ru › DuckDB

Разбиение Hive

Примеры

Чтение данных из разбиеного набора данных Hive:

SELECT *
FROM read_parquet('orders/*/*/*.parquet', hive_partitioning = true);

Запись таблицы в разбиение набора данных Hive:

COPY orders
TO 'orders' (FORMAT PARQUET, PARTITION_BY (year, month));

Обратите внимание, что опции PARTITION_BY использовать выражения нельзя. Вы можете создавать столбцы на лету, используя следующий синтаксис:

COPY (SELECT *, year(timestamp) AS year, month(timestamp) AS month FROM services)
TO 'test' (PARTITION_BY (year, month));

При чтении столбцы разбиения считываются из структуры каталога и могут быть включены или исключены в зависимости от параметра hive_partitioning.

FROM read_parquet('test/*/*/*.parquet', hive_partitioning = true);  -- will include year, month partition columns
FROM read_parquet('test/*/*/*.parquet', hive_partitioning = false); -- will not include year, month columns

Разбиение Hive

Разбиение Hive — это стратегия разбиения, которая используется для разделения таблицы на несколько файлов на основе ключей разбиения. Файлы организованы в папки. В каждой папке ключ разбиения имеет значение, определяемое именем папки.

Ниже приведен пример иерархии разбиения файлов Hive. Файлы разделены по двум ключам (year и month).

orders
├── year=2021
│    ├── month=1
│    │   ├── file1.parquet
│    │   └── file2.parquet
│    └── month=2
│        └── file3.parquet
└── year=2022
     ├── month=11
     │   ├── file4.parquet
     │   └── file5.parquet
     └── month=12
         └── file6.parquet

Файлы, хранящиеся в этой иерархии, могут быть прочитаны с использованием флага hive_partitioning.

SELECT *
FROM read_parquet('orders/*/*/*.parquet', hive_partitioning = true);

Когда мы указываем флаг hive_partitioning, значения столбцов будут считываться из каталогов.

Проталкивание фильтров

Фильтры по ключам разбиения автоматически проталкиваются в файлы. Таким образом, система пропускает чтение файлов, которые не нужны для ответа на запрос. Например, рассмотрим следующий запрос для вышеуказанного набора данных:

SELECT *
FROM read_parquet('orders/*/*/*.parquet', hive_partitioning = true)
WHERE year = 2022
  AND month = 11;

При выполнении этого запроса будут считываться только следующие файлы:

orders
└── year=2022
     └── month=11
         ├── file4.parquet
         └── file5.parquet

Автообнаружение

По умолчанию система пытается определить, являются ли предоставленные файлы иерархией разбиения Hive. И если да, то флаг hive_partitioning включается автоматически. Автообнаружение будет анализировать имена папок и искать шаблон 'key' = 'value'. Это поведение можно переопределить, используя параметр конфигурации hive_partitioning.

SET hive_partitioning = false;

Типы Hive

hive_types — способ указать логические типы разбиений Hive в структуре:

SELECT *
FROM read_parquet(
    'dir/**/*.parquet',
    hive_partitioning = true,
    hive_types = {'release': DATE, 'orders': BIGINT}
);

hive_types будет автоматически определяться для следующих типов: DATE, TIMESTAMP и BIGINT. Чтобы отключить автообнаружение, можно установить флаг hive_types_autocast = 0.

Запись разбиение файлов

См. раздел Запись разбиений.

© Copyright 2018–2024 Stichting DuckDB Foundation
Licensed under the MIT License.
https://duckdb.org/docs/data/partitioning/hive_partitioning.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API