Перейти к основному содержанию
Перейти к основному содержанию

Parquet

Входной форматВыходной форматСиноним

Описание

Apache Parquet — это колоночный формат хранения данных, широко распространённый в экосистеме Hadoop. ClickHouse поддерживает чтение и запись данных в этом формате.

Соответствие типов данных

В таблице ниже показано, как типы данных Parquet сопоставляются с типами данных ClickHouse.

Тип Parquet (логический, преобразованный или физический)Тип данных ClickHouse
BOOLEANBool
UINT_8UInt8
INT_8Int8
UINT_16UInt16
INT_16Int16/Enum16
UINT_32UInt32
INT_32Int32
UINT_64UInt64
INT_64Int64
DATEDate32
TIMESTAMP, TIMEDateTime64
FLOATFloat32
DOUBLEFloat64
INT96DateTime64(9, 'UTC')
BYTE_ARRAY, UTF8, ENUM, BSONString
JSONJSON
FIXED_LEN_BYTE_ARRAYFixedString
DECIMALDecimal
LISTArray
MAPMap
structTuple
FLOAT16Float32
UUIDFixedString(16)
INTERVALFixedString(12)

При записи в файл Parquet типы данных, для которых нет соответствующего типа Parquet, преобразуются в ближайший доступный тип:

Тип данных ClickHouseТип Parquet
IPv4UINT_32
IPv6FIXED_LEN_BYTE_ARRAY (16 байт)
Date (16 бит)DATE (32 бита)
DateTime (32 бита, секунды)TIMESTAMP (64 бита, миллисекунды)
Int128/UInt128/Int256/UInt256FIXED_LEN_BYTE_ARRAY (16/32 байта, порядок little-endian)

Массивы могут быть вложенными и могут иметь значение типа Nullable в качестве аргумента. Типы Tuple и Map также могут быть вложенными.

Типы данных столбцов таблицы ClickHouse могут отличаться от соответствующих полей вставляемых данных Parquet. При вставке данных ClickHouse интерпретирует типы данных согласно приведённой выше таблице, а затем приводит данные к тому типу данных, который установлен для столбца таблицы ClickHouse. Например, столбец Parquet UINT_32 может быть прочитан в столбец ClickHouse IPv4.

Для некоторых типов Parquet не существует близкого по смыслу типа ClickHouse. Мы читаем их следующим образом:

  • TIME (время суток) читается как метка времени. Например, 10:23:13.000 становится 1970-01-01 10:23:13.000.
  • TIMESTAMP/TIME с isAdjustedToUTC=false — это локальное время по настенным часам (поля год, месяц, день, час, минута, секунда и доля секунды в локальном часовом поясе, независимо от того, какой конкретный часовой пояс считается локальным), аналогично SQL TIMESTAMP WITHOUT TIME ZONE. ClickHouse читает его так, как если бы это была метка времени в UTC. Например, 2025-09-29 18:42:13.000 (представляющее показания локальных настенных часов) становится 2025-09-29 18:42:13.000 (DateTime64(3, 'UTC'), представляя точку во времени). При преобразовании к String выводятся корректные год, месяц, день, час, минута, секунда и доля секунды, которые затем могут интерпретироваться как относящиеся к какому-либо локальному часовому поясу, а не к UTC. Противоинтуитивно, смена типа с DateTime64(3, 'UTC') на DateTime64(3) не поможет, так как оба типа представляют точку во времени, а не показание часов, но DateTime64(3) будет некорректно форматироваться с использованием локального часового пояса.
  • INTERVAL в настоящий момент читается как FixedString(12) с сырым двоичным представлением временного интервала в том виде, в котором он закодирован в файле Parquet.

Пример использования

Вставка данных

Используйте файл Parquet со следующими данными, сохранённый под именем football.parquet:

    ┌───────date─┬─season─┬─home_team─────────────┬─away_team───────────┬─home_team_goals─┬─away_team_goals─┐
 1. │ 2022-04-30 │   2021 │ Sutton United         │ Bradford City       │               1 │               4 │
 2. │ 2022-04-30 │   2021 │ Swindon Town          │ Barrow              │               2 │               1 │
 3. │ 2022-04-30 │   2021 │ Tranmere Rovers       │ Oldham Athletic     │               2 │               0 │
 4. │ 2022-05-02 │   2021 │ Port Vale             │ Newport County      │               1 │               2 │
 5. │ 2022-05-02 │   2021 │ Salford City          │ Mansfield Town      │               2 │               2 │
 6. │ 2022-05-07 │   2021 │ Barrow                │ Northampton Town    │               1 │               3 │
 7. │ 2022-05-07 │   2021 │ Bradford City         │ Carlisle United     │               2 │               0 │
 8. │ 2022-05-07 │   2021 │ Bristol Rovers        │ Scunthorpe United   │               7 │               0 │
 9. │ 2022-05-07 │   2021 │ Exeter City           │ Port Vale           │               0 │               1 │
10. │ 2022-05-07 │   2021 │ Harrogate Town A.F.C. │ Sutton United       │               0 │               2 │
11. │ 2022-05-07 │   2021 │ Hartlepool United     │ Colchester United   │               0 │               2 │
12. │ 2022-05-07 │   2021 │ Leyton Orient         │ Tranmere Rovers     │               0 │               1 │
13. │ 2022-05-07 │   2021 │ Mansfield Town        │ Forest Green Rovers │               2 │               2 │
14. │ 2022-05-07 │   2021 │ Newport County        │ Rochdale            │               0 │               2 │
15. │ 2022-05-07 │   2021 │ Oldham Athletic       │ Crawley Town        │               3 │               3 │
16. │ 2022-05-07 │   2021 │ Stevenage Borough     │ Salford City        │               4 │               2 │
17. │ 2022-05-07 │   2021 │ Walsall               │ Swindon Town        │               0 │               3 │
    └────────────┴────────┴───────────────────────┴─────────────────────┴─────────────────┴─────────────────┘

Введите данные:

INSERT INTO football FROM INFILE 'football.parquet' FORMAT Parquet;

Чтение данных

Прочитайте данные в формате Parquet:

SELECT *
FROM football
INTO OUTFILE 'football.parquet'
FORMAT Parquet
Совет

Parquet — это двоичный формат, который не отображается в человекочитаемом виде в терминале. Используйте INTO OUTFILE для записи файлов в формате Parquet.

Для обмена данными с Hadoop вы можете использовать движок таблиц HDFS.

Параметры форматирования

НастройкаОписаниеПо умолчанию
input_format_parquet_case_insensitive_column_matchingНе учитывать регистр при сопоставлении столбцов Parquet со столбцами CH.0
input_format_parquet_preserve_orderИзбегайте изменения порядка строк при чтении из файлов Parquet. Обычно это значительно замедляет чтение.0
input_format_parquet_filter_push_downПри чтении файлов Parquet пропускать целые группы строк на основе выражений WHERE/PREWHERE и статистики min/max в метаданных Parquet.1
input_format_parquet_bloom_filter_push_downПри чтении файлов Parquet пропускать целые группы строк на основе выражений WHERE и фильтра Блума в метаданных файлов Parquet.0
input_format_parquet_use_native_readerПри чтении файлов в формате Parquet использовать нативный считыватель вместо считывателя Arrow.0
input_format_parquet_allow_missing_columnsДопускать отсутствующие столбцы при чтении входных форматов Parquet1
input_format_parquet_local_file_min_bytes_for_seekМинимальное количество байт при локальном чтении файла, начиная с которого используется seek вместо чтения с пропуском (ignore) во входном формате Parquet8192
input_format_parquet_enable_row_group_prefetchВключить предварительную выборку групп строк при разборе файлов Parquet. В настоящее время предварительную выборку может выполнять только однопоточный парсер.1
input_format_parquet_skip_columns_with_unsupported_types_in_schema_inferenceПропускать столбцы с неподдерживаемыми типами при определении схемы для формата Parquet0
input_format_parquet_max_block_sizeМаксимальный размер блока для читателя Parquet.65409
input_format_parquet_prefer_block_bytesСредний размер блока в байтах, выдаваемого читателем Parquet16744704
input_format_parquet_enable_json_parsingПри чтении файлов Parquet разбирайте столбцы JSON как столбцы ClickHouse JSON Column.1
output_format_parquet_row_group_sizeЦелевое количество строк в группе.1000000
output_format_parquet_row_group_size_bytesЦелевой размер группы строк в байтах до сжатия.536870912
output_format_parquet_string_as_stringИспользуйте тип Parquet String вместо Binary для столбцов типа String.1
output_format_parquet_fixed_string_as_fixed_byte_arrayИспользуйте тип Parquet FIXED_LEN_BYTE_ARRAY вместо Binary для столбцов FixedString.1
output_format_parquet_versionВерсия формата Parquet для формата вывода. Поддерживаемые версии: 1.0, 2.4, 2.6 и 2.latest (по умолчанию)2.latest
output_format_parquet_compression_methodМетод сжатия для формата вывода Parquet. Поддерживаемые кодеки: snappy, lz4, brotli, zstd, gzip, none (без сжатия)zstd
output_format_parquet_compliant_nested_typesВ схеме файла Parquet используйте имя 'element' вместо 'item' для элементов списка. Это исторический артефакт реализации библиотеки Arrow. Как правило, это повышает совместимость, за исключением, возможно, некоторых старых версий Arrow.1
output_format_parquet_use_custom_encoderИспользуйте более быструю реализацию кодировщика Parquet.1
output_format_parquet_parallel_encodingВыполнять кодирование в Parquet в нескольких потоках. Требует включённой настройки output_format_parquet_use_custom_encoder.1
output_format_parquet_data_page_sizeЦелевой размер страницы в байтах перед сжатием.1048576
output_format_parquet_batch_sizeПроверять размер страницы каждые указанное количество строк. Рассмотрите возможность уменьшения значения, если в столбцах средний размер значений превышает несколько КБ.1024
output_format_parquet_write_page_indexДобавить возможность записывать страничный индекс в файлы Parquet.1
input_format_parquet_import_nestedУстаревший параметр, ни на что не влияет.0
input_format_parquet_local_time_as_utctrueОпределяет тип данных, используемый при выводе схемы (schema inference) для временных меток Parquet с isAdjustedToUTC=false. Если true: DateTime64(..., 'UTC'), если false: DateTime64(...). Ни один из вариантов не является полностью корректным, так как в ClickHouse нет типа данных для локального времени по настенным часам (wall-clock time). Как ни парадоксально, значение 'true', вероятно, является менее некорректным вариантом, поскольку форматирование временной метки 'UTC' как String даст представление правильного локального времени.