如何将多事件合并为单一行以展示应用最新启停时间?
问题描述
我有一批记录不同作业启动或结束时间的事件数据,示例如下:
[ { "appName": "a1", "eventName": "START", "eventTime": "t1" }, { "appName": "a1", "eventName": "END", "eventTime": "t2" }, { "appName": "a1", "eventName": "START", "eventTime": "t3" }, { "appName": "a2", "eventName": "START", "eventTime": "t4" } ]
需要将这些数据处理为每个应用一行的表格,展示其最新启动时间和结束时间,目标输出示例:
--AppName--Last Start Time--Last End Time-- --a1--t3--t2-- --a2--t4--null--
目前使用 stats latest(eventTime) by appName, eventName 能提取每个应用各事件的最新时间,但结果是分多行展示的,如何将其合并为单行?
解决方案
可以直接在stats命令中结合条件判断,按应用聚合时分别提取START和END事件的最新时间,一步得到单行结果:
stats latest(eval(if(eventName="START", eventTime, null()))) as "Last Start Time", latest(eval(if(eventName="END", eventTime, null()))) as "Last End Time" by appName
关键逻辑说明:
eval(if(eventName="START", eventTime, null())):仅保留当前事件为START时的时间值,其余情况返回nulllatest():针对每个appName,取对应字段的最新非空值,自动忽略无对应事件的null情况- 最终每个
appName会生成一行数据,包含对应的最新启动/结束时间,未发生过的事件字段显示null
如果已经有了多行的stats结果,也可以用transpose命令转置,但上述方法更高效直接。
内容的提问来源于stack exchange,提问作者Janardan Kelkar
相关产品推荐
相关产品推荐

