説明
Protobuf 形式は、Protocol Buffers のフォーマットです。
このフォーマットでは外部のフォーマットスキーマが必要で、クエリ間でキャッシュされます。
ClickHouse は以下をサポートしています。
proto2とproto3の両方の構文Repeated/optional/requiredフィールド
_ (アンダースコア) と . (ドット) は同一と見なされます。
カラムと Protocol Buffers’ のメッセージのフィールドの型が異なる場合は、必要な変換が適用されます。
ネストされたメッセージもサポートされています。たとえば、次のメッセージ型のフィールド z の場合です。
x.y.z (または x_y_z、X.y_Z など) という名前のカラムを見つけようとします。
ネストされたメッセージは、ネストされたデータ構造 への入力や、そこからの出力に適しています。
次のような protobuf スキーマで定義されたデフォルト値は適用されず、代わりに テーブルのデフォルト値 が使用されます。
input_format_protobuf_oneof_presence が設定されている場合、ClickHouse は oneof 内でどのフィールドが見つかったかを示すカラムに値を設定します。
input_format_protobuf_oneof_presence はデフォルトで無効になっています
ClickHouse は protobuf メッセージを 長さ区切り フォーマットで入出力します。
つまり、各メッセージの前に、その長さを 可変長整数 (varint) として書き込む必要があります。
使用例
データの読み書き
サンプルファイルこの例で使用するファイルは、examples リポジトリで入手できます。
protobuf_message.bin からデータを読み込んで ClickHouse のテーブルに格納します。続いて、Protobuf 形式を使用して、そのデータを protobuf_message_from_clickhouse.bin という名前のファイルに書き出します。
schemafile.proto ファイルの内容が次のとおりであるとします。
バイナリファイルの生成
バイナリファイルの生成
Protobuf 形式でデータをシリアライズ/デシリアライズする方法をすでに理解している場合は、この手順をスキップできます。ここでは Python を使ってデータを protobuf_message.bin にシリアライズし、それを ClickHouse に読み込みます。
別の言語を使いたい場合は、“主要な言語で長さ区切りの Protobuf メッセージを読み書きする方法”も参照してください。次のコマンドを実行して、schemafile.proto と
同じディレクトリに schemafile_pb2.py という名前の Python ファイルを生成します。このファイルには、
UserData Protobuf メッセージを表す Python クラスが含まれます。schemafile_pb2.py と同じ
ディレクトリに generate_protobuf_data.py という名前の新しい Python ファイルを作成し、次のコードを貼り付けます。uv を使って、
Python 仮想環境で実行することをおすすめします。Protobuf 形式を使用して、データをバイナリファイルに書き戻すこともできます。
protobuf_message_from_clickhouse.bin に書き出されたデータをデシリアライズできるようになりました。
ClickHouse Cloud を使用したデータの読み書き
format_protobuf_schema
設定を使用して、クエリ内でスキーマを指定できます。この例では、ローカル
マシンからシリアライズされたデータを読み込み、それを ClickHouse Cloud のテーブルに挿入する方法を示します。
前の例と同様に、ClickHouse Cloud で Protobuf スキーマに従ってテーブルを作成します。
format_schema_source は、設定 format_schema の指定元を定義します
設定可能な値:
- ‘file’ (デフォルト) : Cloud ではサポートされていません
- ‘string’:
format_schemaはスキーマの内容そのものです。 - ‘query’:
format_schemaはスキーマを取得するためのクエリです。
format_schema_source='string'
format_schema_source='query'
自動生成されたスキーマを使用する
format_protobuf_use_autogenerated_schema 設定を使用します。
例:
structureToProtobufSchema を使用して、テーブル構造に基づいて Protobuf スキーマを自動生成します。続いて、このスキーマを使ってデータを Protobuf 形式にシリアライズします。
自動生成されたスキーマを使用して Protobuf ファイルを読み込むこともできます。この場合、そのファイルも同じスキーマを使って作成されている必要があります。
format_protobuf_use_autogenerated_schema はデフォルトで有効で、format_schema が設定されていない場合に適用されます。
また、設定 output_format_schema を使用すると、入力/出力時に自動生成されたスキーマをファイルに保存することもできます。たとえば:
path/to/schema/schema.capnp というファイルに保存されます。
Protobuf キャッシュを削除
format_schema_path で読み込まれた Protobuf スキーマを再読み込みするには、SYSTEM DROP ... FORMAT CACHE ステートメントを使用します。