ClickHouse/docs/ja/integrations/data-ingestion/data-formats/binary.md
2024-11-18 11:58:58 +09:00

10 KiB
Raw Blame History

sidebar_label slug
バイナリとネイティブ /ja/integrations/data-formats/binary-native

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 │              │                    │         │                  │                │
└───────┴────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘

:::tip 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

プロトコルバッファ

プロトコルバッファを使用するには、まずスキーマファイルを定義する必要があります:

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'

これにより、データがproto.binファイルに保存されます。ClickHouseはProtobufデータのインポートやネストされたメッセージもサポートしています。ProtobufSingleを使用して、単一のプロトコルバッファメッセージを扱うことも検討してください(この場合、長さ区切りは省略されます)。

Capn Proto

ClickHouseがサポートするもう一つの人気のあるバイナリシリアライゼーションフォーマットはCapn 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'

CapnProto対応の型に合わせるため、DateカラムをUInt32としてキャストする必要があることに注意してください。

その他のフォーマット

ClickHouseでは、さまざまなシナリオやプラットフォームに対応するために、多くのフォーマット、テキストフォーマットとバイナリフォーマットの両方が導入されています。以下の記事で、さらに多くのフォーマットとそれを扱う方法を探索してください

また、clickhouse-localもチェックし、ClickHouseサーバーを起動せずにローカル/リモートファイルで作業するためのポータブルな完全機能のツールです。