求助:如何将嵌套JSON加载到Apache Druid单列?格式异常问题
我明白你现在遇到的问题——当把嵌套JSON字段c_blob_Column加载到Apache Druid时,它的格式不符合预期,大概率是被转义成了带反斜杠的字符串(比如"{\"aaaa\":{\"k\":\"sample\",\"c\":\"sample2\"}}"),而不是保留你想要的原始JSON结构。下面给你两种针对性的解决方案,你可以根据自己的实际需求选择:
方案1:将嵌套JSON作为原始字符串Blob存储(保留正确格式)
如果你的需求是把整个c_blob_Column作为完整的JSON字符串存储,不需要解析内部字段,那么可以通过修改parser配置,使用javascript类型的解析器手动提取原始JSON内容,避免自动转义:
修改后的Kafka ingestion配置(重点关注parser部分):
{ "type": "kafka", "dataSchema": { "dataSource": "blob", "parser": { "type": "javascript", "function": "function(row) { var jsonObj = JSON.parse(row); return { 'a': jsonObj.a, 'b': jsonObj.b, 'c_blob_Column': JSON.stringify(jsonObj.c_blob_Column), 'timestamp': jsonObj.timestamp // 若数据中无timestamp字段,请自行调整 }; }", "parseSpec": { "format": "json", "dimensionsSpec": { "dimensions": ["a", "b", {"name": "c_blob_Column", "type": "string"}] }, "timestampSpec": { "column": "timestamp", "format": "iso" } } }, "metricsSpec": [], "granularitySpec": { "type": "uniform", "segmentGranularity": "DAY", "queryGranularity": "none", "rollup": false } }, "ioConfig": { "topic": "blob_topic", "consumerProperties": { "bootstrap.servers": "<local server>" }, "appendToExisting": false, "useEarliestOffset": true, "taskDuration": "PT15M" }, "tuningConfig": { "type": "kafka", "maxRowsPerSegment": 5000000, "maxRowsInMemory": 25000 } }
关键说明:
- 通过
javascript解析器手动处理每行数据:先解析原始JSON,再将c_blob_Column重新序列化为字符串,这样得到的就是无额外转义的标准JSON格式字符串。 - 在
dimensionsSpec中明确指定c_blob_Column的类型为string,确保Druid按纯字符串格式存储该字段。
方案2:解析嵌套JSON为单独维度(方便查询内部字段)
如果之后需要对c_blob_Column里的aaaa.k或aaaa.c等嵌套字段进行过滤、聚合等查询操作,建议直接解析嵌套结构,把内部字段拆分为独立维度:
修改后的核心配置(parser和dimensionsSpec部分):
{ "type": "kafka", "dataSchema": { "dataSource": "blob", "parser": { "type": "json", "parseSpec": { "format": "json", "dimensionsSpec": { "dimensions": [ "a", "b", {"name": "c_blob_Column_aaaa_k", "type": "string", "path": "c_blob_Column.aaaa.k"}, {"name": "c_blob_Column_aaaa_c", "type": "string", "path": "c_blob_Column.aaaa.c"} // 可根据需求继续添加其他嵌套字段 ] }, "timestampSpec": { "column": "timestamp", "format": "iso" } } }, "metricsSpec": [], "granularitySpec": { "type": "uniform", "segmentGranularity": "DAY", "queryGranularity": "none", "rollup": false } }, // 其余ioConfig、tuningConfig保持原配置不变 }
关键说明:
- 使用
json类型解析器,通过path参数指定嵌套字段的层级路径,Druid会自动解析并提取这些字段作为独立维度。 - 这种方式适合需要对嵌套字段进行精细化查询的场景。
额外注意事项
- 如果你的原始数据中没有
timestamp字段,需要调整timestampSpec:比如使用auto自动生成时间,或者指定数据中已存在的其他时间字段。 - 若需要将嵌套JSON作为JSON对象而非字符串存储,可以启用Druid的
druid-json-extensions扩展,然后在维度配置中指定类型为json,这样可以直接以JSON对象形式存储和查询,但需确保集群已安装该扩展。
内容的提问来源于stack exchange,提问作者Moushmi
相关产品推荐
相关产品推荐

