ClickHouse为何将嵌套结构字段创建为Array(String)类型?
ClickHouse中Nested类型字段为何是Array(String)而非String?
这是因为ClickHouse的Nested类型本质是列存储优化的数组式嵌套结构,它和常规POJO/JSON里的单对象嵌套逻辑完全不同:
- 当你定义
Nested类型时,ClickHouse会将嵌套结构的每个子字段拆解为同长度的数组。比如你创建的geoLocation Nested(country String, region String, city String),实际会生成三个平行数组:geoLocation.country、geoLocation.region、geoLocation.city,数组的每个下标位置对应主记录中一组完整的嵌套属性。 - 这种设计是为了适配ClickHouse的列存引擎特性,最大化查询性能,尤其是在处理批量嵌套数据时效率更高。
如果你的需求是存储单个嵌套对象(而非多组嵌套元素),可以改用Tuple类型替代Nested:
create table foo( id UInt64, geoLocation Tuple(country String, region String, city String) ) ENGINE = MergeTree() ORDER BY id;
此时geoLocation下的每个子字段都是单个String类型,而非数组。
内容的提问来源于stack exchange,提问作者JL_SO
相关产品推荐
相关产品推荐

