说明
-
数组:在 Elasticsearch 中,所有字段都原生支持数组。在 ClickHouse 中,数组必须显式定义 (例如
Array(String)) ;其优势是可以访问和查询特定位置的元素,例如an_array[1]。 -
多字段:Elasticsearch 允许以多种方式索引同一字段 (例如同时使用
text和keyword) 。在 ClickHouse 中,这种模式必须通过单独的列或视图来建模。 -
Map 和 JSON 类型 - 在 ClickHouse 中,
Map类型通常用于表示动态键值结构,例如resourceAttributes和logAttributes。该类型允许在运行时添加任意键,从而实现灵活的无 schema 摄取——这与 Elasticsearch 中的 JSON 对象在理念上类似。不过,也有一些重要限制需要注意:- 统一的值类型:ClickHouse 的
Map列必须具有一致的值类型 (例如Map(String, String)) 。如果不进行强制类型转换,则不支持混合类型的值。 - 性能开销:访问
Map中的任意键,都需要将整个 map 加载到内存中,这对性能而言可能并不理想。 - 不支持子列:与 JSON 不同,
Map中的键不会表示为真正的子列,这限制了 ClickHouse 高效进行索引、压缩和查询的能力。
Map,转而采用 ClickHouse 增强后的JSON类型。JSON类型弥补了Map的许多不足:- 真正的列式存储:每个 JSON 路径都会存储为一个子列,从而实现高效的压缩、过滤和向量化查询执行。
- 支持混合类型:不同的数据类型 (例如整数、字符串、数组) 可以在同一路径下共存,而无需强制转换或类型统一。
-
文件系统可扩展性:对动态键 (
max_dynamic_paths) 和类型 (max_dynamic_types) 的内部限制,即使在高基数键集合的情况下,也能防止磁盘上的列文件数量激增。 -
紧凑存储:NULL 和缺失值会以稀疏方式存储,以避免不必要的开销。
JSON类型尤其适合可观测性工作负载,既具备无 schema 摄取的灵活性,又拥有 ClickHouse 原生类型的性能和可扩展性——因此,它是动态属性字段中替代Map的理想选择。 如需进一步了解 JSON 类型,我们建议阅读 JSON 指南 和 “How we built a new powerful JSON data type for ClickHouse”。
- 统一的值类型:ClickHouse 的