You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何将嵌套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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:15:43