日志服务数据加工: JMES语法介绍

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: 日志服务数据加工: 介绍数据加工用到的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"}
                            }
                        }
                 }

jmes语法

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

通过索引来获取值

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

原始日志

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

jmes语法

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

通过切片操作获取值

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

原始日志

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

jmes语法

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

多种用法综合使用

原始日志

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

jmes语法

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"}
}

jmes语法

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

原始日志2

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

jmes语法

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"}
    ]
}

jmes语法

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

多值选取

原始日志

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

jmes语法

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

计算数组长度

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

原始日志

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

jmes语法

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 Tutorial

进一步参考

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

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
18天前
|
人工智能 数据可视化 开发工具
Git log 进阶用法(含格式化、以及数据过滤)
Git log 进阶用法(含格式化、以及数据过滤)
|
5月前
|
SQL 关系型数据库 MySQL
我使用flinkcdc的sql形式进行全量同步,4张表,有两张表数据没进去,看日志,id怎么是null呢?
我使用flinkcdc的sql形式进行全量同步,4张表,有两张表数据没进去,看日志,id怎么是null呢?
119 40
|
8天前
|
监控 NoSQL MongoDB
mongoDB查看数据的插入日志
【5月更文挑战第2天】mongoDB查看数据的插入日志
34 0
|
1天前
|
监控 NoSQL MongoDB
mongoDB查看数据的插入日志
【5月更文挑战第9天】mongoDB查看数据的插入日志
13 4
|
7天前
|
关系型数据库 MySQL 数据管理
MySQL通过 bin-log 恢复从备份点到灾难点之间数据
MySQL通过 bin-log 恢复从备份点到灾难点之间数据
|
20天前
|
机器学习/深度学习 前端开发 数据挖掘
工具变量法(两阶段最小二乘法2SLS)线性模型分析人均食品消费时间序列数据和回归诊断(下)
工具变量法(两阶段最小二乘法2SLS)线性模型分析人均食品消费时间序列数据和回归诊断
223 11
|
26天前
工具变量法(两阶段最小二乘法2SLS)线性模型分析人均食品消费时间序列数据和回归诊断2
工具变量法(两阶段最小二乘法2SLS)线性模型分析人均食品消费时间序列数据和回归诊断
|
26天前
|
机器学习/深度学习 前端开发 数据挖掘
R语言计量经济学:工具变量法(两阶段最小二乘法2SLS)线性模型分析人均食品消费时间序列数据和回归诊断
R语言计量经济学:工具变量法(两阶段最小二乘法2SLS)线性模型分析人均食品消费时间序列数据和回归诊断
|
29天前
|
消息中间件 存储 Kafka
【Kafka】Kafka 的日志保留期与数据清理策略
【4月更文挑战第13天】【Kafka】Kafka 的日志保留期与数据清理策略
|
5月前
|
SQL 关系型数据库 MySQL
⑩⑥ 【MySQL】详解 触发器TRIGGER,协助 确保数据的完整性,日志记录,数据校验等操作。
⑩⑥ 【MySQL】详解 触发器TRIGGER,协助 确保数据的完整性,日志记录,数据校验等操作。
46 0

相关产品

  • 日志服务