天天看点

日志服务数据加工: JMES语法介绍进一步参考

日志服务数据加工: JMES语法介绍进一步参考

概述

JMES是一个增强型的JSON查询计算语言, 不仅可以用于对JSON数据进行抽取, 还可以做计算与转换。关于JMES的语法详细介绍可以参考

JMES Tutorial

数据加工中的json_select函数和e_json函数支持以JMES语法对(字段或表达式表示JSON的)值提取或计算特定值。其用法为

json_select(字段, "jmes表达式", default=None, restrict=False)
e_json(字段, jmes="jmes表达式", ...)           

关于这两个函数的具体用法,可参考

json_select函数

e_json函数

本文介绍JMES常用语法。

通过key来获取值

原始日志

"json_data":{
   "a": "foo",
   "b": "bar",
   "c": "baz"
 }           

jmes语法

json_select(v("json_data"), "a") #返回值 foo
json_select(v("json_data"), "b") #返回值 bar
json_select(v("json_data"), "c") # 返回值 baz           

通过层级访问来获取值

"json_data":{"a": 
                            {"b":
                                 {"c":
                                  {"d":"value"}
                            }
                        }
                 }           

json_select(v("json_data"), "a.b.c.d") # 返回值 value           

通过索引来获取值

通过索引访问主要用于json中的数组数据

"json_data":{
   "a": ["b", "c", "d", "e", "f"]
 }           

json_select(v("json_data"), "a[2]") # 返回值 d           

通过切片操作获取值

对于json中的数组数据还可以使用切片操作

"json_data":{
   "a": ["b", "c", "d", "e", "f"]
 }           

json_select(v("json_data"), "a[2: ]") # 返回值 ["d", "e", "f"]           

多种用法综合使用

"json_data":{
  "a": {
      "b": {
          "c": [{"d": [0, [1, 2]]}, {"d": [3, 4]}]
        }
  }
}           

json_select(v("json_data"), "a.b.c[0].d[1][0]") # 返回值 1           

通过投影来获取值

原始日志1

"json_data":{
        "people": [
          {"first": "James", "last": "d"},
          {"first": "Jacob", "last": "e"},
          {"first": "Jayden", "last": "f"},
          {"missing": "different"}
        ],
        "foo": {"bar": "baz"}
}           

json_select(v("json_data"), "people[*].first") # 返回值 ["James","Jacob","Jayden"]           

原始日志2

"json_data":{
      "ops": {
        "functionA": {"numArgs": 2},
        "functionB": {"numArgs": 3},
        "functionC": {"variadic": true}
      }
    }
           

json_select(v("json_data"), "ops.*.numArgs") # 返回值 [2, 3]           

原始日志3

"json_data":{
    "machines": [
      {"name": "a", "state": "running"},
      {"name": "b", "state": "stopped"},
      {"name": "c", "state": "running"}
    ]
}
           

json_select(v("json_data"), "machines[?state=='running'].name") # 返回值 ["a", "c"]           

多值选取

"json_data":{
    "people": [
      {
        "name": "a",
        "state": {"name": "up"}
      },
      {
        "name": "b",
        "state": {"name": "down"}
      }
    ]
}           

json_select(v("json_data"), "people[].[name, state.name]") # 返回值[["a","up"],["b","down"]]           

计算数组长度

对于json中的数组数据,jmes语法支持数组长度的计算

"json_data":{
   "a": ["b", "c", "d", "e", "f"]
 }           

json_select(v("json_data"), "length(a)") # 返回值 5           
# length(a) > 0, 设置"no-empty"字段为true
e_if(json_select(v("json_data"), "length(a)", default=0), e_set("no-empty", true))           

更多关于JMES的语法参考

进一步参考

欢迎扫码加入官方钉钉群获得实时更新与阿里云工程师的及时直接的支持:

日志服务数据加工: JMES语法介绍进一步参考