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

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

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

Для демонстрации мы будем использовать таблицу some_data и данные; вы можете воспроизвести это в своём экземпляре ClickHouse.

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

Наиболее эффективный формат данных для экспорта и импорта между узлами ClickHouse — формат Native. Экспорт выполняется с помощью оператора 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 для локальной работы с файлами.

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

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

Сжатие в формате Native

Мы также можем включить сжатие при экспорте данных в формат 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.