优化JQ分组脚本:解决首行丢失与大数据内存溢出问题
高效JQ分组聚合解决方案
问题描述
需要按name字段对多JSON输入分组,将每组的Date1、Date2、Date3值分别聚合为数组。现有脚本存在两个问题:
- 丢失首行输入数据
- 处理大数据集时内存占用过高,执行失败
现有脚本:
[inputs] | group_by(.name)[] | [{names: .[].name, availabledates1: [.[].Date1], availabledates2: [.[].Date2], availabledates3: [.[].Date3]}] | unique_by(.names) | .[]
问题根源
- 首行丢失:未使用
-n选项时,jq将第一个输入对象作为初始值,[inputs]仅读取后续输入,导致首行数据被遗漏。 - 内存溢出:
group_by需将所有输入数据加载到内存完成分组,且后续多次迭代数组(如.[].name)进一步消耗内存,无法适配大数据集。
高效解决方案
使用reduce流式处理,配合-n选项实现低内存分组聚合:
-n 'reduce inputs as $item ({}; .[$item.name] = ( .[$item.name] // { names: $item.name, availabledates1: [], availabledates2: [], availabledates3: [] } | .availabledates1 += [$item.Date1] | .availabledates2 += [$item.Date2] | .availabledates3 += [$item.Date3] ) ) | .[]'
方案说明
-n选项:让jq初始值为null,inputs读取所有输入JSON对象,包含首行数据,解决丢失问题。reduce流式处理:逐个处理输入对象,仅维护当前分组的聚合状态,无需加载全量数据到内存,大幅降低内存占用,适配大数据集。- 分组逻辑:若当前
name分组不存在,则初始化含空数组的对象;若已存在,则追加对应Date值到数组,实现高效聚合。
验证结果
输入:
{ "name": "examplename1", "Date1": "value1", "Date2": "value2", "Date3": "value3" } { "name": "examplename1", "Date1": "value4", "Date2": "value5", "Date3": "value6" } { "name": "examplename2", "Date1": "value7", "Date2": "value8", "Date3": "value9" } { "name": "examplename2", "Date1": "value10", "Date2":"value11", "Date3": "value12" }
执行脚本后输出:
{ "names": "examplename1", "availabledates1": [ "value1", "value4" ], "availabledates2": [ "value2", "value5" ], "availabledates3": [ "value3", "value6" ] } { "names": "examplename2", "availabledates1": [ "value7", "value10" ], "availabledates2": [ "value8", "value11" ], "availabledates3": [ "value9", "value12" ] }
内容的提问来源于stack exchange,提问作者Michael S
相关产品推荐
相关产品推荐

