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

Использование нативных и бинарных форматов в 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

Protocol Buffers

Not supported in ClickHouse Cloud

Для работы с Protocol Buffers сначала нужно определить файл схемы:

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.