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

Использование родных и бинарных форматов в ClickHouse

ClickHouse поддерживает несколько бинарных форматов, которые обеспечивают лучшую производительность и экономию пространства. Бинарные форматы также безопасны с точки зрения кодировки символов, поскольку данные сохраняются в бинарной форме.

Мы будем использовать some_data таблицу и данные для демонстрации, не стесняйтесь воспроизводить это на вашей инстансе ClickHouse.

Экспорт в родном формате ClickHouse

Наиболее эффективным форматом данных для экспорта и импорта данных между узлами ClickHouse является Родной формат. Экспорт выполняется с использованием оператора INTO OUTFILE:

SELECT * FROM some_data
INTO OUTFILE 'data.clickhouse' FORMAT Native

Это создаст data.clickhouse файл в родном формате.

Импорт из родного формата

Чтобы импортировать данные, мы можем использовать file() для небольших файлов или исследовательских целей:

DESCRIBE file('data.clickhouse', Native);
┌─name──┬─type───┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ path  │ String │              │                    │         │                  │                │
│ month │ Date   │              │                    │         │                  │                │
│ hits  │ UInt32 │              │                    │         │                  │                │
└───────┴────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
подсказка

При использовании функции file(), с ClickHouse Cloud вам необходимо выполнять команды в clickhouse client на машине, где находится файл. Другой вариант — использовать clickhouse-local для изучения файлов локально.

В производственных условиях мы используем FROM INFILE для импорта данных:

INSERT INTO sometable
FROM INFILE 'data.clickhouse'
FORMAT Native

Сжатие родного формата

Мы также можем включить сжатие при экспорте данных в родной формат (а также в большинстве других форматов) с помощью оператора COMPRESSION:

SELECT * FROM some_data
INTO OUTFILE 'data.clickhouse'
COMPRESSION 'lz4'
FORMAT Native

Мы использовали LZ4 сжатие для экспорта. Нам придется указать его при импорте данных:

INSERT INTO sometable
FROM INFILE 'data.clickhouse'
COMPRESSION 'lz4'
FORMAT Native

Экспорт в RowBinary

Другим поддерживаемым бинарным форматом является RowBinary, который позволяет импортировать и экспортировать данные в бинарных строках:

SELECT * FROM some_data
INTO OUTFILE 'data.binary' FORMAT RowBinary

Это создаст data.binary файл в формате бинарных строк.

Исследование файлов RowBinary

Автоматический вывод схемы не поддерживается для этого формата, поэтому, чтобы исследовать перед загрузкой, нам необходимо явно определить схему:

SELECT *
FROM file('data.binary', RowBinary, 'path String, month Date, hits UInt32')
LIMIT 5
┌─path───────────────────────────┬──────month─┬─hits─┐
│ Bangor_City_Forest             │ 2015-07-01 │   34 │
│ Alireza_Afzal                  │ 2017-02-01 │   24 │
│ Akhaura-Laksam-Chittagong_Line │ 2015-09-01 │   30 │
│ 1973_National_500              │ 2017-10-01 │   80 │
│ Attachment                     │ 2017-09-01 │ 1356 │
└────────────────────────────────┴────────────┴──────┘

Рекомендуется использовать RowBinaryWithNames, который также добавляет строку заголовка со списком колонок. RowBinaryWithNamesAndTypes также добавит дополнительную строку заголовка с типами колонок.

Импорт из файлов RowBinary

Чтобы загрузить данные из файла RowBinary, мы можем использовать оператор FROM INFILE:

INSERT INTO sometable
FROM INFILE 'data.binary'
FORMAT RowBinary

Импорт единственного бинарного значения с использованием RawBLOB

Предположим, мы хотим прочитать весь бинарный файл и сохранить его в поле в таблице. В таком случае можно использовать формат RawBLOB. Этот формат можно использовать только с таблицей, содержащей одну колонку:

CREATE TABLE images(data String) Engine = Memory

Давайте сохраним изображение в таблице images:

cat image.jpg | clickhouse-client -q "INSERT INTO images FORMAT RawBLOB"

Мы можем проверить длину поля data, которая будет равна оригинальному размеру файла:

SELECT length(data) FROM images
┌─length(data)─┐
│         6121 │
└──────────────┘

Экспорт данных RawBLOB

Этот формат также можно использовать для экспорта данных с помощью оператора INTO OUTFILE:

SELECT * FROM images LIMIT 1
INTO OUTFILE 'out.jpg'
FORMAT RawBLOB

Обратите внимание, что мы должны были использовать LIMIT 1, потому что экспорт более чем одного значения создаст поврежденный файл.

MessagePack

ClickHouse поддерживает импорт и экспорт в MessagePack с использованием MsgPack. Чтобы экспортировать в формат MessagePack:

SELECT *
FROM some_data
INTO OUTFILE 'data.msgpk'
FORMAT MsgPack

Чтобы импортировать данные из файла MessagePack:

INSERT INTO sometable
FROM INFILE 'data.msgpk'
FORMAT MsgPack

Протокол Буферов

Not supported in ClickHouse Cloud

Для работы с Протоколом Буферов сначала необходимо определить файл схемы:

syntax = "proto3";

message MessageType {
  string path = 1;
  date month = 2;
  uint32 hits = 3;
};

Путь к этому файлу схемы (schema.proto в нашем случае) устанавливается в настройке format_schema для формата Protobuf:

SELECT * FROM some_data
INTO OUTFILE 'proto.bin'
FORMAT Protobuf
SETTINGS format_schema = 'schema:MessageType'

Это сохраняет данные в файл proto.bin. ClickHouse также поддерживает импорт данных Protobuf, а также вложенных сообщений. Рассмотрите возможность использования ProtobufSingle для работы с единственным сообщением Protocol Buffer (в этом случае длина ограничителей будет опущена).

Cap'n Proto

Not supported in ClickHouse Cloud

Другим популярным форматом бинарной сериализации, поддерживаемым ClickHouse, является Cap'n Proto. Аналогично формату Protobuf, мы должны определить файл схемы (schema.capnp) в нашем примере:

@0xec8ff1a10aa10dbe;

struct PathStats {
  path @0 :Text;
  month @1 :UInt32;
  hits @2 :UInt32;
}

Теперь мы можем экспортировать и импортировать с использованием формата CapnProto и этой схемы:

SELECT
    path,
    CAST(month, 'UInt32') AS month,
    hits
FROM some_data
INTO OUTFILE 'capnp.bin'
FORMAT CapnProto
SETTINGS format_schema = 'schema:PathStats'

Обратите внимание, что нам пришлось привести колонку Date к типу UInt32, чтобы соответствовать соответствующим типам.

Другие форматы

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

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