メインコンテンツまでスキップ
メインコンテンツまでスキップ

ClickHouseにおけるネイティブおよびバイナリ形式の使用

ClickHouseは複数のバイナリ形式をサポートしており、これによりパフォーマンスとスペース効率が向上します。バイナリ形式は、データがバイナリ形式で保存されるため、文字エンコーディングに対しても安全です。

デモンストレーションには some_data tabledata を使用しますので、あなたの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を使用してローカルでファイルを探索することです。

本番環境では、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

Protocol Buffersを使用するには、まずスキーマファイルを定義する必要があります:

syntax = "proto3";

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

このスキーマファイルへのパス(この場合 schema.proto)は、Protobuf形式の設定オプションであるformat_schemaに設定されます:

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

これによりdata.protoファイルにデータが保存されます。ClickHouseはProtobufデータのインポートおよびネストされたメッセージもサポートしています。単一のProtocol Bufferメッセージで作業するためにProtobufSingleを使用することを検討してください(この場合、長さデリミタは省略されます)。

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サーバーを起動せずにローカル/リモートファイルで作業できる、ポータブルでフル機能のツールです。