Druid SQL查询嵌套对象报StringDictionaryEncodedColumn错误求助
Druid嵌套JSON查询报错解决方案
问题原因
你遇到的错误是因为event.data列被Druid识别为字符串类型(StringDictionaryEncodedColumn),而JSON_VALUE函数要求操作的是Druid原生的嵌套数据类型(NestedDataComplexColumn),直接调用自然会报错。
解决方案
方案1:查询时实时解析字符串为JSON(无需修改存储)
既然event.data是JSON格式的字符串,可以先用PARSE_JSON函数将其转换为Druid支持的嵌套数据结构,再进行字段提取:
-- 方法1:用JSON_VALUE提取 SELECT JSON_VALUE(PARSE_JSON("event.data"), '$.favItems') as "fav.Items" FROM "db" -- 方法2:用Druid嵌套字段点语法 SELECT PARSE_JSON("event.data").favItems as "fav.Items" FROM "db"
⚠️ 注意:这种方式是实时解析字符串,数据量较大时会有性能损耗,适合临时查询或小数据量场景。
方案2:修改存储结构,定义为嵌套数据类型(性能最优)
如果需要长期高效查询嵌套字段,建议在数据摄入阶段就将event.data配置为Druid的嵌套数据类型:
- 在数据摄入Spec中,将
event.data的类型指定为nested,或通过JSON解析器自动识别嵌套结构(比如Kafka摄入的parseSpec设为json并开启嵌套支持)。 - 重新摄入数据后,即可直接使用原查询语句或更简洁的点语法查询:
-- 原语法可用 SELECT JSON_VALUE("event.data", '$.favItems') as "fav.Items" FROM "db" -- 更简洁的点语法 SELECT "event.data".favItems as "fav.Items" FROM "db"
额外注意
如果event.data的字符串格式不标准(比如示例中的obj, {}这种非法JSON),PARSE_JSON会返回NULL,需要先确保字符串是合法的JSON格式,必要时先做数据清洗。
内容的提问来源于stack exchange,提问作者Dmns
相关产品推荐
相关产品推荐

