ClickHouse поддерживает несколько двоичных форматов, которые обеспечивают более высокую производительность и более эффективное использование пространства. Двоичные форматы также не создают проблем с кодировкой символов, поскольку данные сохраняются в двоичном виде.
Для демонстрации мы будем использовать таблицу some_data и данные; при желании вы можете воспроизвести это на своём экземпляре ClickHouse.
Экспорт в собственном формате ClickHouse Native
Наиболее эффективный формат для экспорта и импорта данных между узлами ClickHouse — Native. Экспорт выполняется с помощью оператора INTO OUTFILE:
SELECT * FROM some_data
INTO OUTFILE 'data.clickhouse' FORMAT NativeЭто создаст файл data.clickhouse в формате Native.
Импорт из формата Native
Чтобы импортировать данные, можно использовать file() для небольших файлов или в ознакомительных целях:
DESCRIBE file('data.clickhouse', Native);┌─name──┬─type───┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ path │ String │ │ │ │ │ │
│ month │ Date │ │ │ │ │ │
│ hits │ UInt32 │ │ │ │ │ │
└───────┴────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘В рабочей среде мы используем 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 MsgPackProtocol Buffers
Чтобы работать с Protocol Buffers, сначала нужно определить файл схемы:
syntax = "proto3";
message MessageType {
string path = 1;
date month = 2;
uint32 hits = 3;
};Путь к этому файлу схемы (schema.proto в нашем случае) указывается в параметре format_schema в разделе Settings формата Protobuf:
SELECT * FROM some_data
INTO OUTFILE 'proto.bin'
FORMAT Protobuf
SETTINGS format_schema = 'schema:MessageType'Это сохраняет данные в файл proto.bin. ClickHouse также поддерживает импорт данных Protobuf и вложенных сообщений. Для работы с одним сообщением Protocol Buffer можно использовать ProtobufSingle (в этом случае разделители длины будут опущены).
Cap'n Proto
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 поддерживает множество форматов — текстовых и двоичных — для самых разных сценариев и платформ. Подробнее о форматах и способах работы с ними читайте в следующих статьях:
- Форматы CSV и TSV
- Parquet
- Форматы JSON
- Regex и Template
- Формат Native и двоичные форматы
- Форматы SQL
Также обратите внимание на clickhouse-local — переносимый полнофункциональный инструмент для работы с локальными и удалёнными файлами без запуска сервера ClickHouse.