【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

结果:
Jq Play

这样的话,可以把一个structured nested JSON 提取出flattened的metric。

说人话就是JSON提取指标字段值。

Jq 和 Path 对比

先看看Jq的效果
Apache Druid

Path的表达式也能提取,但是缺点就是转换出来的仍旧是原来的类型,因为为了表示原始精度,指标采用了字符串表示。不仅如此,转换出来的永远是一个数组。

表达式:

$.metrics.[?(@.name == 'vcpu')].value

结果如图所示:
JsonPath

这种情况就是Druid无法将这个Flatten列识别为一个long类型的Metric或者Dimension,转换也做不到。(以我目前尝试的结果来看)

佐证 getting-a-single-value-from-a-json-object-using-jsonpath

结论不言而喻。

posted @ 2021-09-06 11:30  一杯半盏  阅读(354)  评论(0编辑  收藏  举报