【发布时间】:2021-11-11 03:51:14
【问题描述】:
我正在寻找一些帮助来增加我的 jq-foo,并且可以使用一些指导。我有一些使用 JQ 编写脚本的 etl 作业,我想看看是否有办法让运行在 CPU 利用率和/或速度方面更高效。
这是一个示例负载:
{
"timestamp": 1636601959,
"uniqueId": "Foo",
"value": 10
},
{
"timestamp": 1636601859,
"uniqueId": "Bar",
"value": 13
}
我想做一些类似(伪代码)的事情:
if [ (epoch 15 minutes ago) -le timestamp ]; then
name=uniqueId; value_total=value(total); uniqueId_count=(uniqueId(count_total))
fi
现在我在做类似(伪代码)的事情:
for jq[timestamps] in $(json); do
if [ (epoch 15 minutes ago) -le timestamp ]; then
name=uniqueId; value_total=(value_total + value); uniqueId_count=(uniqueId_count + 1).
fi
done
有没有一种方法可以在不使用 for 循环反复调用 jq 'select() ...' 来遍历每个对象的情况下简化这一点?
【问题讨论】:
-
输出中的
.uniqueId_count字段是否应该在整个输入中总计或逐项递增? -
该计数将是 uniqueId 在 json 文档中出现的总次数。所以我基本上需要得到最后 15 分钟内的 groupby(uniqueids) 总数。该值也将以类似的方式进行汇总。因此,如果 'foo' 出现在不同的时间戳但都在 15 分钟前,我需要总值(10 + n + n + 等)
-
但在您的伪代码中,检查
timestamp -le (epoch 15 minutes ago)会发现那些早于 15 分钟的项目,而不是“在过去 15 分钟内” -
啊,非常正确,我解释错了...应该在 15 分钟内...实际代码看起来像这样
if [ "${minutes_ago}" -le "${time}" ]; then其中minutes_ago是 15 分钟前的纪元,@987654329 @ 是 json 时间戳 -
更新了我的答案以反映所有的变化(我希望如此)。
标签: json performance jq