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

Работа с Parquet в ClickHouse

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

Совет

Когда вы указываете путь к файлу в запросе, то, откуда ClickHouse попытается читать данные, зависит от варианта ClickHouse, который вы используете.

Если вы используете clickhouse-local, чтение будет выполняться из пути, относительно директории, из которой вы запустили clickhouse-local. Если вы используете ClickHouse Server или ClickHouse Cloud через clickhouse client, чтение будет выполняться из пути, относительно директории /var/lib/clickhouse/user_files/ на сервере.

Импорт из Parquet

Перед загрузкой данных мы можем использовать функцию file(), чтобы изучить структуру примерного файла формата Parquet:

DESCRIBE TABLE file('data.parquet', Parquet);

Мы использовали Parquet в качестве второго аргумента, чтобы указать ClickHouse формат файла. Будут выведены столбцы и их типы:

┌─имя──┬─тип──────────────┬─тип_по_умолчанию─┬─выражение_по_умолчанию─┬─комментарий─┬─выражение_кодека─┬─выражение_ttl─┐
│ path │ Nullable(String) │                  │                         │             │                  │               │
│ date │ Nullable(String) │                  │                         │             │                  │               │
│ hits │ Nullable(Int64)  │                  │                         │             │                  │               │
└──────┴──────────────────┴──────────────────┴─────────────────────────┴─────────────┴──────────────────┴───────────────┘

Мы также можем исследовать файлы перед импортом данных, используя всю мощь SQL:

SELECT *
FROM file('data.parquet', Parquet)
LIMIT 3;
┌─path──────────────────────┬─date───────┬─hits─┐
│ Akiba_Hebrew_Academy      │ 2017-08-01 │  241 │
│ Aegithina_tiphia          │ 2018-02-01 │   34 │
│ 1971-72_Utah_Stars_season │ 2016-10-01 │    1 │
└───────────────────────────┴────────────┴──────┘
Совет

Можно не указывать формат явно для file() и INFILE/OUTFILE. В этом случае ClickHouse автоматически определит формат по расширению файла.

Импорт в существующую таблицу

Создадим таблицу, в которую будем импортировать данные в формате Parquet:

CREATE TABLE sometable
(
    `path` String,
    `date` Date,
    `hits` UInt32
)
ENGINE = MergeTree
ORDER BY (date, path);

Теперь можно импортировать данные с помощью предложения FROM INFILE:

INSERT INTO sometable
FROM INFILE 'data.parquet' FORMAT Parquet;

SELECT *
FROM sometable
LIMIT 5;
┌─path──────────────────────────┬───────date─┬─hits─┐
│ 1988_in_philosophy            │ 2015-05-01 │   70 │
│ 2004_Green_Bay_Packers_season │ 2015-05-01 │  970 │
│ 24_hours_of_lemans            │ 2015-05-01 │   37 │
│ 25604_Karlin                  │ 2015-05-01 │   20 │
│ ASCII_ART                     │ 2015-05-01 │    9 │
└───────────────────────────────┴────────────┴──────┘

Обратите внимание, что ClickHouse автоматически преобразовал строки формата Parquet (в столбце date) в тип Date. Это происходит потому, что ClickHouse выполняет приведение типов на основе типов в целевой таблице.

Загрузка локального файла на удалённый сервер

Если вы хотите загрузить локальный файл Parquet на удалённый сервер ClickHouse, вы можете сделать это, передав его содержимое в clickhouse-client через pipe, как показано ниже:

clickhouse client -q "INSERT INTO sometable FORMAT Parquet" < data.parquet

Создание новых таблиц из файлов Parquet

Поскольку ClickHouse читает схему файлов Parquet, мы можем динамически создавать таблицы:

CREATE TABLE imported_from_parquet
ENGINE = MergeTree
ORDER BY tuple() AS
SELECT *
FROM file('data.parquet', Parquet)

Это автоматически создаст и заполнит таблицу на основе указанного parquet-файла:

DESCRIBE TABLE imported_from_parquet;
┌─имя──┬─тип──────────────┬─тип_по_умолчанию─┬─выражение_по_умолчанию─┬─комментарий─┬─выражение_кодека─┬─выражение_ttl─┐
│ path │ Nullable(String) │                  │                         │             │                  │               │
│ date │ Nullable(String) │                  │                         │             │                  │               │
│ hits │ Nullable(Int64)  │                  │                         │             │                  │               │
└──────┴──────────────────┴──────────────────┴─────────────────────────┴─────────────┴──────────────────┴───────────────┘

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

Экспорт в формат Parquet

Совет

При использовании INTO OUTFILE с ClickHouse Cloud команды в clickhouse client нужно запускать на той машине (хосте), на которую будет записан файл.

Чтобы экспортировать любую таблицу или результат запроса в файл Parquet, можно использовать конструкцию INTO OUTFILE:

SELECT *
FROM sometable
INTO OUTFILE 'export.parquet'
FORMAT Parquet

В результате в текущем рабочем каталоге будет создан файл export.parquet.

Типы данных ClickHouse и Parquet

Типы данных ClickHouse и Parquet в основном совпадают, но всё же имеют некоторые отличия. Например, ClickHouse экспортирует тип DateTime как значение типа int64 в формате Parquet. Если затем импортировать его обратно в ClickHouse, мы увидим числа (файл time.parquet):

SELECT * FROM file('time.parquet', Parquet);
┌─n─┬───────time─┐
│ 0 │ 1673622611 │
│ 1 │ 1673622610 │
│ 2 │ 1673622609 │
│ 3 │ 1673622608 │
│ 4 │ 1673622607 │
└───┴────────────┘

В этом случае можно использовать функции преобразования типов:

SELECT
    n,
    toDateTime(time)                 <--- преобразование целого числа в DateTime
FROM file('time.parquet', Parquet);
┌─n─┬────toDateTime(time)─┐
│ 0 │ 2023-01-13 15:10:11 │
│ 1 │ 2023-01-13 15:10:10 │
│ 2 │ 2023-01-13 15:10:09 │
│ 3 │ 2023-01-13 15:10:08 │
│ 4 │ 2023-01-13 15:10:07 │
└───┴─────────────────────┘

Дополнительные материалы

ClickHouse поддерживает множество форматов, как текстовых, так и бинарных, для самых разных сценариев и платформ. Подробнее о форматах и работе с ними см. в следующих статьях:

Также ознакомьтесь с clickhouse-local — переносимым полнофункциональным инструментом для работы с локальными и удалёнными файлами без необходимости развёртывать сервер ClickHouse.