【发布时间】:2019-07-10 12:38:36
【问题描述】:
我有一个名为 input.json 的非常大的文件(20GB+ 压缩),其中包含如下 JSON 对象流:
{
"timestamp": "12345",
"name": "Some name",
"type": "typea"
}
{
"timestamp": "12345",
"name": "Some name",
"type": "typea"
}
{
"timestamp": "12345",
"name": "Some name",
"type": "typeb"
}
我想根据它们的type 属性将该文件拆分为多个文件:typea.json、typeb.json 等,每个文件都包含它们自己的只有匹配类型属性的 json 对象流。
对于较小的文件,我已经设法解决了这个问题,但是对于这么大的文件,我的 AWS 实例内存不足。由于我希望降低内存使用量,我知道我需要使用 --stream,但我正在努力了解如何实现这一目标。
cat input.json | jq -c --stream 'select(.[0][0]=="type") | .[1]' 将返回每个类型属性的值,但我如何使用它来过滤对象?
任何帮助将不胜感激!
【问题讨论】:
-
有多少不同的类型? (如果我们在一次传递中扇出多个进程,我们需要多少个文件描述符保持打开状态?如果我们对每种类型进行一次传递,我们需要多少次传递?)
-
你真的不需要在这里需要
--stream,顺便说一句。如果您的对象较大,则需要这样做,但它们都足够小,可以单独处理。 -
顺便说一句,这个输入根本不是(错误的,最初不是)有效的 JSON。
jq .,输入您的示例输入,失败并显示parse error: Invalid literal at line 2, column 14。 -
(我可以看到需要
--stream的唯一情况是问题是否歪曲了您的数据格式,并且对象位于其他更大的对象中,而不是出现在顶级对象中)。跨度> -
@CharlesDuffy 大约有 5-10 种类型。感谢您对 --stream 的帮助,看来我误解了它的用途。
标签: json bash stream jq partitioning