• 【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

    结论不言而喻。

  • 相关阅读:
    HDU1864--01背包
    HDU4508--完全背包
    HDU5410--01背包+完全背包
    HDU1284--完全背包
    HDU1248--完全背包
    HDU2191--多重背包(二进制分解+01背包)
    HDU2186--水
    PAT乙级--1003
    51Nod--1006 lcs
    51Nod--1008
  • 原文地址:https://www.cnblogs.com/slankka/p/15233017.html
Copyright © 2020-2023  润新知