【Apache Druid】總結jq和JsonPath在處理JSON轉換的一個技巧
阿新 • • 發佈:2021-09-06
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
結論不言而喻。