Разбиение 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