Advanced JQ技巧:优化ETL作业CPU利用率及运行速度咨询
优化方案
你完全可以用单条jq命令完成全部过滤、聚合逻辑,无需外部循环遍历、也不需要反复调用jq,执行效率会有非常明显的提升,CPU占用也会大幅降低。
核心实现思路是把15分钟前的时间阈值作为参数传入jq,在jq内部用reduce单次遍历所有JSON对象完成计算,仅需启动一次jq进程,避免了重复创建进程、重复解析JSON的冗余开销。
适用输入为标准JSON数组的场景
示例数据调整为合法JSON数组格式如下:
[ { "timestamp": 1636601959, "uniqueId": "Foo", "value": 10 }, { "timestamp": 1636601859, "uniqueId": "Bar", "value": 13 } ]
执行命令:
# 计算15分钟前的Unix时间戳(15分钟=900秒) cutoff=$(($(date +%s) - 900)) # 单条jq完成所有计算 jq --argjson cutoff "$cutoff" ' reduce .[] as $item ( {value_total: 0, uniqueId_count: 0, valid_names: []}; if $item.timestamp >= $cutoff then .value_total += $item.value | .uniqueId_count += 1 | .valid_names += [$item.uniqueId] else . end ) ' 你的数据文件路径.json
适用输入为JSON行格式(每行一个JSON对象)的场景
如果你的数据是每行一个独立JSON对象的格式,调整命令如下即可:
cutoff=$(($(date +%s) - 900)) jq -n --argjson cutoff "$cutoff" ' reduce inputs as $item ( {value_total: 0, uniqueId_count: 0, valid_names: []}; if $item.timestamp >= $cutoff then .value_total += $item.value | .uniqueId_count += 1 | .valid_names += [$item.uniqueId] else . end ) ' 你的数据文件路径.jsonl
输出结果会直接包含你需要的三个字段:所有符合条件的uniqueId列表valid_names、value总和value_total、符合条件的记录数uniqueId_count,可根据实际需求调整输出字段。
内容的提问来源于stack exchange,提问作者Nick Hatfield
相关产品推荐
相关产品推荐

