注意事項
-
配列: Elasticsearch では、すべてのフィールドがネイティブで配列をサポートしています。ClickHouse では、配列を明示的に定義する必要があります (例:
Array(String)) 。一方で、特定の位置の要素にアクセスしてクエリできるという利点があり、たとえばan_array[1]のように扱えます。 -
マルチフィールド: Elasticsearch では、同じフィールドを複数の方法で索引化 できます (例:
textとkeywordの両方) 。ClickHouse では、このパターンは個別のカラムやビューで表現する必要があります。 -
Map と JSON 型 - ClickHouse では、
Map型はresourceAttributesやlogAttributesのような動的なキー・バリュー構造を表現するためによく使われます。この型では任意のキーを実行時に追加できるため、柔軟なスキーマレス インジェストが可能で、考え方としては Elasticsearch の JSON オブジェクトに近いものです。ただし、考慮すべき重要な制約があります。- 値の型を統一する必要がある: ClickHouse の
Mapカラムでは、値の型を一貫させる必要があります (例:Map(String, String)) 。異なる型の値は、型変換なしではサポートされません。 - 性能上のコスト:
Mapの任意のキーにアクセスするには、マップ全体をメモリに読み込む必要があるため、性能面で不利になる場合があります。 - サブカラムがない: JSON とは異なり、
Mapのキーは真のサブカラムとして表現されないため、ClickHouse での効率的な索引化、圧縮、クエリに制約があります。
Mapから、ClickHouse の強化されたJSON型への移行を進めています。JSON型は、Mapの多くの欠点を解消します。- 真の列指向ストレージ: 各 JSON パスはサブカラムとして保存されるため、効率的な圧縮、フィルタリング、ベクトル化クエリ実行が可能です。
- 異種型のサポート: 異なるデータ型 (例: 整数、文字列、配列) を、型変換や型の統一なしで同じパス配下に共存させることができます。
-
ファイルシステムのスケーラビリティ: 動的キー (
max_dynamic_paths) および型 (max_dynamic_types) に対する内部制限により、キー集合のカーディナリティが高い場合でも、ディスク上のカラムファイルの爆発的な増加を防げます。 -
高密度な格納:
nullや欠損値はスパースに格納されるため、不要なオーバーヘッドを避けられます。JSON型は、特にオブザーバビリティ ワークロードに適しており、スキーマレス インジェストの柔軟性と ClickHouse ネイティブ型の性能およびスケーラビリティを両立します。そのため、動的な属性フィールドにおけるMapの理想的な置き換えとなります。 JSON 型の詳細については、JSON ガイド および “How we built a new powerful JSON data type for ClickHouse” を参照することをおすすめします。
- 値の型を統一する必要がある: ClickHouse の