【Apache Druid】总结jq和JsonPath在处理JSON转换的一个技巧
Apache Druid Jq Expression
先看一个Apache Druid Digest Spec的ioConfig部分:
{
"topic": "cr_slankka_internal_metric",
"inputFormat": {
"type": "json",
"flattenSpec": {
"useFieldDiscovery": true,
"fields": [
{
"type": "jq",
"name": "vcpu",
"expr": ".[\"metrics\"] | from_entries | .vcpu | tonumber"
},
{
"type": "jq",
"name": "vmem",
"expr": ".[\"metrics\"] | from_entries | .vmem | tonumber"
}
]
},
"featureSpec": {}
}
}
打开
jQ play
输入
{
"metrics": [
{
"name": "vcpu",
"value": "10240"
},
{
"name": "vmem",
"value": "327680"
}
]
}
输入Filter:
.["metrics"] | from_entries | .vcpu | tonumber
或者
.["metrics"] | from_entries | .vmem | tonumber
结果:
这样的话,可以把一个structured nested JSON 提取出flattened的metric。
说人话就是JSON提取指标字段值。
Jq 和 Path 对比
先看看Jq的效果
Path的表达式也能提取,但是缺点就是转换出来的仍旧是原来的类型,因为为了表示原始精度,指标采用了字符串表示。不仅如此,转换出来的永远是一个数组。
表达式:
$.metrics.[?(@.name == 'vcpu')].value
结果如图所示:
这种情况就是Druid无法将这个Flatten列识别为一个long类型的Metric或者Dimension,转换也做不到。(以我目前尝试的结果来看)
佐证 getting-a-single-value-from-a-json-object-using-jsonpath
结论不言而喻。