json - 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 之间启动更多类似代理的服务。
解决方案
尝试这样的过滤器,不需要展平:
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"
}
推荐阅读
- arrays - 仅读取双指针的值时在双指针上使用三指针?
- angular - Angular 11 为 fa-icon 动态分配 [icon] 属性
- sql-server - 使用 T-SQL、DAX 或 M Query 在值更改后创建 StartDate 和 EndDate 列
- python - Python:过滤或搜索str列表时将范围应用于通配符(需要将任何没有10位数字的str列表项添加到列表中)
- firebase - 什么 IAM 策略控制 Firebase 函数配置
- android - .beginTransaction().add 在 Android Studio 中不起作用
- python - Django for循环显示数据库中的所有对象
- python - 读取 CSV 文件并创建新的 csv 和列
- python - 将 C++ for 循环转换为 python
- c# - Twitchlib PubSub 看不到事件