Чтение и запись файлов Parquet
Примеры
Прочитать один файл Parquet:
SELECT * FROM 'test.parquet';
Определить столбцы/типы в файле Parquet:
DESCRIBE SELECT * FROM 'test.parquet';
Создать таблицу из файла Parquet:
CREATE TABLE test AS
SELECT * FROM 'test.parquet'; Если файл не заканчивается на .parquet, используйте функцию read_parquet:
SELECT *
FROM read_parquet('test.parq'); Использовать список параметров для чтения трех файлов Parquet и обработки их как одной таблицы:
SELECT * FROM read_parquet(['file1.parquet', 'file2.parquet', 'file3.parquet']);
Прочитать все файлы, соответствующие шаблону glob:
SELECT * FROM 'test/*.parquet';
Прочитать все файлы, соответствующие шаблону glob, и включить столбец filename,
который указывает, из какого файла получена каждая строка:
SELECT *
FROM read_parquet('test/*.parquet', filename = true); Использовать список шаблонов glob для чтения всех файлов Parquet из двух определенных папок:
SELECT * FROM read_parquet(['folder1/*.parquet', 'folder2/*.parquet']);
Читать по протоколу HTTPS:
SELECT *
FROM read_parquet('https://some.url/some_file.parquet'); Запросить метаданные файла Parquet:
SELECT *
FROM parquet_metadata('test.parquet'); Запросить метаданные файла Parquet:
SELECT *
FROM parquet_file_metadata('test.parquet'); Запросить метаданные ключ-значение файла Parquet:
SELECT *
FROM parquet_kv_metadata('test.parquet'); Запросить схему файла Parquet:
SELECT *
FROM parquet_schema('test.parquet'); Записать результаты запроса в файл Parquet с использованием стандартного сжатия (Snappy):
COPY
(SELECT * FROM tbl)
TO 'result-snappy.parquet'
(FORMAT 'parquet'); Записать результаты запроса в файл Parquet со специфическим сжатием и размером группы строк:
COPY
(FROM generate_series(100_000))
TO 'test.parquet'
(FORMAT 'parquet', COMPRESSION 'zstd', ROW_GROUP_SIZE 100_000); Экспортировать содержимое таблицы всей базы данных в формат parquet:
EXPORT DATABASE 'target_directory' (FORMAT PARQUET);
Файлы Parquet
Файлы Parquet — это сжатые колоночные файлы, эффективные для загрузки и обработки. DuckDB предоставляет поддержку как чтения, так и записи файлов Parquet эффективным образом, а также поддержку фильтрации и проекций в сканировании файлов Parquet.
Наборы данных Parquet отличаются количеством файлов, размером отдельных файлов, используемым алгоритмом сжатия, размером группы строк и т. д. Это оказывает существенное влияние на производительность. Подробности см. в Руководстве по производительности.
read_parquet Функция
| Функция | Описание | Пример |
|---|---|---|
read_parquet(path_or_list_of_paths) | Читать файл(ы) Parquet | SELECT * FROM read_parquet('test.parquet'); |
parquet_scan(path_or_list_of_paths) | Псевдоним для read_parquet
| SELECT * FROM parquet_scan('test.parquet'); |
Если ваш файл заканчивается на .parquet, синтаксис функции является необязательным. Система автоматически определит, что вы читаете файл Parquet:
SELECT * FROM 'test.parquet';
Несколько файлов можно прочитать одновременно, предоставив шаблон glob или список файлов. Дополнительная информация в разделе нескольких файлов.
Параметры
Существует ряд опций, которые можно передать функции read_parquet или COPY оператору.
| Имя | Описание | Тип | По умолчанию |
|---|---|---|---|
binary_as_string | Файлы Parquet, созданные устаревшими программами, не правильно устанавливают флаг UTF8 для строк, что приводит к загрузке строковых столбцов как BLOB. Установите это значение в true, чтобы загрузить двоичные столбцы как строки. | BOOL | false |
encryption_config | Настройка для шифрования Parquet. | STRUCT | - |
filename | Включать или нет дополнительный столбец filename в результат. | BOOL | false |
file_row_number | Включать или нет столбец file_row_number . | BOOL | false |
hive_partitioning | Интерпретировать ли путь как путь с разбиением Hive. | BOOL | true |
union_by_name | Объединять ли столбцы из нескольких схем по имени, а не по позиции. | BOOL | false |
Частичное чтение
DuckDB поддерживает проецирование в сам файл Parquet. Это означает, что при запросе файла Parquet читаются только столбцы, необходимые для запроса. Это позволяет вам читать только ту часть файла Parquet, которая вас интересует. DuckDB сделает это автоматически.
DuckDB также поддерживает фильтрацию в чтении файла Parquet. Когда вы применяете фильтр к столбцу, сканируемому из файла Parquet, фильтр будет передан в сканирование и может быть использован для пропуска частей файла с помощью встроенных zonemap. Обратите внимание, что это зависит от того, содержит ли ваш файл Parquet zonemap.
Фильтрация и проекция обеспечивают существенные преимущества производительности. Дополнительную информацию можно найти в нашем блоге «Запрос данных Parquet с точностью с помощью DuckDB».
Вставки и представления
Вы также можете вставить данные в таблицу или создать таблицу непосредственно из файла Parquet. Это загрузит данные из файла Parquet и вставит их в базу данных:
Вставка данных из файла Parquet в таблицу:
INSERT INTO people
SELECT * FROM read_parquet('test.parquet'); Создание таблицы непосредственно из файла Parquet:
CREATE TABLE people AS
SELECT * FROM read_parquet('test.parquet'); Если вы хотите сохранить данные, хранящиеся в файле Parquet, но хотите запросить файл Parquet напрямую, вы можете создать представление на основе read_parquet функции. Затем вы можете запросить файл Parquet, как если бы это была встроенная таблица:
Создание представления на основе файла Parquet:
CREATE VIEW people AS
SELECT * FROM read_parquet('test.parquet'); Запрос файла Parquet:
SELECT * FROM people;
Запись в файлы Parquet
DuckDB также поддерживает запись в файлы Parquet с использованием синтаксиса оператора COPY. Подробности, включая все возможные параметры оператора COPY, см. на странице COPY оператора.
Запись запроса в сжатый файл Parquet с использованием Snappy:
COPY
(SELECT * FROM tbl)
TO 'result-snappy.parquet'
(FORMAT 'parquet'); Запись tbl в сжатый файл Parquet с использованием zstd:
COPY tbl
TO 'result-zstd.parquet'
(FORMAT 'parquet', CODEC 'zstd'); Запись tbl в сжатый файл Parquet с использованием zstd с наименьшим уровнем сжатия, что обеспечивает самую быструю компрессию:
COPY tbl
TO 'result-zstd.parquet'
(FORMAT 'parquet', CODEC 'zstd', COMPRESSION_LEVEL 1); Запись в файл Parquet с метаданными ключ-значение:
COPY (
SELECT
42 AS number,
true AS is_even
) TO 'kv_metadata.parquet' (
FORMAT PARQUET,
KV_METADATA {
number: 'Answer to life, universe, and everything',
is_even: 'not ''odd''' -- single quotes in values must be escaped
}
); Запись CSV-файла в несжатый файл Parquet:
COPY
'test.csv'
TO 'result-uncompressed.parquet'
(FORMAT 'parquet', CODEC 'uncompressed'); Запись запроса в файл Parquet с zstd-сжатием (то же, что и CODEC) и размером группы строк:
COPY
(FROM generate_series(100_000))
TO 'row-groups-zstd.parquet'
(FORMAT PARQUET, COMPRESSION ZSTD, ROW_GROUP_SIZE 100_000); Сжатие LZ4 в настоящее время доступно только в ночных и исходных сборках:
Запись CSV-файла в LZ4_RAW-сжатый файл Parquet:
COPY
(FROM generate_series(100_000))
TO 'result-lz4.parquet'
(FORMAT PARQUET, COMPRESSION LZ4); Или:
COPY
(FROM generate_series(100_000))
TO 'result-lz4.parquet'
(FORMAT PARQUET, COMPRESSION LZ4_RAW); Команда DuckDB EXPORT может быть использована для экспорта всей базы данных в серию файлов Parquet. Дополнительные сведения см. в документации по оператору экспорта:
Экспорт содержимого таблицы всей базы данных в формате Parquet:
EXPORT DATABASE 'target_directory' (FORMAT PARQUET);
Шифрование
DuckDB поддерживает чтение и запись зашифрованных файлов Parquet.
Установка и загрузка расширения Parquet
Поддержка файлов Parquet включена через расширение. Расширение parquet включено практически во всех клиентах. Однако, если ваш клиент не включает расширение parquet, расширение необходимо установить отдельно:
INSTALL parquet;
Страницы в этом разделе
© Copyright 2018–2024 Stichting DuckDB Foundation
Licensed under the MIT License.
https://duckdb.org/docs/data/parquet/overview.html