1. 程式人生 > 其它 >【Apache Druid】總結jq和JsonPath在處理JSON轉換的一個技巧

【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

結論不言而喻。