首页 > 解决方案 > Apache Druid – 在平面 JSON 数据中摄取多个对象仅返回单行

问题描述

我的目标是将这些 JSON 数据作为多行摄取到 Apache Druid 中。数据(比这个例子多出大约 10 倍的行数)是由我无法控制的专有 HTTP 服务器提供的。我无法更改从 HTTP 服务器呈现数据的方式。由于没有来自 HTTP 服务器的通知,因此将定期提取数据。

{
  "1": {
    "lastseen": "2021-02-15T05:02Z",
    "name": "Temperature Sensor A",
    "state": {
      "alert": "none",
      "level": 152,
      "on": true,
      "reachable": true
    }
  },
  "3": {
    "lastseen": "2021-02-15T05:01Z",
    "name": "Temperature Sensor B",
    "state": {
      "alert": "none",
      "level": 13,
      "on": false,
      "reachable": true
    }
  },
  "4": {
    "lastseen": "2021-02-15T05:00Z",
    "name": "Temperature Sensor Backup",
    "state": {
      "alert": "none",
      "level": 76,
      "on": true,
      "reachable": true
    }
  }
}

请注意,缺少对象 2。此编号是来自服务器的内部记录 ID,如果删除对象 2,此 ID 将从后续请求中消失。

我创建了一个成功提取数据的数据源,但它最终成为单行。据我了解,由于 JSON 对象在根级别没有数组,因此 Druid 将这三个对象视为一行。

我怀疑答案就在该flattenSpec地区的某个地方,但我没能做到这一点。到目前为止,我得到的最接近的是以下内容flattenSpec,但这仅返回 JSON 数据的第一行(尽管该行表示正确)。

  "inputFormat": {
    "type": "json",
    "flattenSpec": {
      "fields": [
        {
          "type": "jq",
          "expr": ".[].name",
          "name": "name"
        },
        {
          "type": "jq",
          "expr": ".[].lastseen",
          "name": "lastseen"
        }
      ]
    }
  }

上面flattenSpec给了我一个看起来像这样的单行:

lastseen              | name
2021-02-15T05:02Z     | Temperature Sensor A

我怎样才能让德鲁伊看到所有的行?什么是正确的 flattenSpec(或 jq / JSONPath 表达式)?

我不关心性能,但我宁愿不必在 HTTP 服务器和 Druid 之间启动更多类似代理的服务。

标签: jsonlistjqjsonpathdruid

解决方案


尝试这样的过滤器,不需要展平:

jq '.[] | {name,lastseen}'

使用您的输入,这将导致:

{
  "name": "Temperature Sensor A",
  "lastseen": "2021-02-15T05:02Z"
}
{
  "name": "Temperature Sensor B",
  "lastseen": "2021-02-15T05:01Z"
}
{
  "name": "Temperature Sensor Backup",
  "lastseen": "2021-02-15T05:00Z"
}

推荐阅读