Skip to main content

説明

Protobuf 形式は、Protocol Buffers のフォーマットです。 このフォーマットでは外部のフォーマットスキーマが必要で、クエリ間でキャッシュされます。 ClickHouse は以下をサポートしています。
  • proto2proto3 の両方の構文
  • Repeated/optional/required フィールド
テーブルのカラムと Protocol Buffers’ のメッセージ型のフィールドとの対応関係を判断するために、ClickHouse はそれらの名前を比較します。 この比較では大文字と小文字は区別されず、文字 _ (アンダースコア) と . (ドット) は同一と見なされます。 カラムと Protocol Buffers’ のメッセージのフィールドの型が異なる場合は、必要な変換が適用されます。 ネストされたメッセージもサポートされています。たとえば、次のメッセージ型のフィールド z の場合です。
ClickHouse は、x.y.z (または x_y_zX.y_Z など) という名前のカラムを見つけようとします。 ネストされたメッセージは、ネストされたデータ構造 への入力や、そこからの出力に適しています。 次のような protobuf スキーマで定義されたデフォルト値は適用されず、代わりに テーブルのデフォルト値 が使用されます。
メッセージに oneof が含まれ、input_format_protobuf_oneof_presence が設定されている場合、ClickHouse は oneof 内でどのフィールドが見つかったかを示すカラムに値を設定します。
存在の有無を示すカラム名は、oneof の名前と同じである必要があります。 ネストされたメッセージもサポートされています (basic-examples を参照) 。空のメッセージもサポートされています。 使用可能な型は Int8、UInt8、Int16、UInt16、Int32、UInt32、Int64、UInt64、Enum、Enum8、Enum16 です。 Enum (Enum8 または Enum16 を含む) には、oneof で取り得るすべてのタグに加えて、不在を示す 0 を含める必要があります。文字列表現は問いません。 設定 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 仮想環境で実行することをおすすめします。
次の Python ライブラリをインストールする必要があります。
スクリプトを実行してバイナリファイルを生成します。
スキーマに一致する ClickHouse テーブルを作成します。
コマンドラインからテーブルにデータを挿入します:
Protobuf 形式を使用して、データをバイナリファイルに書き戻すこともできます。
Protobufスキーマがあれば、ClickHouse からファイル protobuf_message_from_clickhouse.bin に書き出されたデータをデシリアライズできるようになりました。

ClickHouse Cloud を使用したデータの読み書き

ClickHouse Cloud では、Protobuf のスキーマファイルをアップロードできません。ただし、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'

スキーマを文字列として指定してデータをClickHouse Cloudに挿入するには、次を実行します。
テーブルに挿入されたデータを選択します:

format_schema_source='query'

Protobuf スキーマはテーブルに保存することもできます。 データの挿入先となるテーブルを ClickHouse Cloud に作成します:
実行するクエリでスキーマを指定して、データをClickHouse Cloudに挿入します:
テーブルに挿入したデータを選択します:

自動生成されたスキーマを使用する

データ用の外部 Protobuf スキーマがなくても、自動生成されたスキーマを使って Protobuf 形式でデータを出力/入力できます。 この場合は、format_protobuf_use_autogenerated_schema 設定を使用します。 例:
この場合、ClickHouse は関数 structureToProtobufSchema を使用して、テーブル構造に基づいて Protobuf スキーマを自動生成します。続いて、このスキーマを使ってデータを Protobuf 形式にシリアライズします。 自動生成されたスキーマを使用して Protobuf ファイルを読み込むこともできます。この場合、そのファイルも同じスキーマを使って作成されている必要があります。
設定 format_protobuf_use_autogenerated_schema はデフォルトで有効で、format_schema が設定されていない場合に適用されます。 また、設定 output_format_schema を使用すると、入力/出力時に自動生成されたスキーマをファイルに保存することもできます。たとえば:
この場合、自動生成された Protobuf スキーマは path/to/schema/schema.capnp というファイルに保存されます。

Protobuf キャッシュを削除

format_schema_path で読み込まれた Protobuf スキーマを再読み込みするには、SYSTEM DROP ... FORMAT CACHE ステートメントを使用します。
最終更新日 2026年7月23日