如何转换行数大于2GB的超大json文件(150GB +)?

pobjuy32  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(179)

每个月我都会收到非常大和复杂的json文件。文件通常为1- 50 GB,有时大于150 GB。文件被加载到awsemr配置单元表中,然后使用配置单元json函数进行处理。当该进程试图加载包含长度大于2GB的行的json文件时,该进程将失败。
我试着用jq(jq -c。json< source.json >)来压缩和格式化文件。这适用于较小的测试文件,但不能扩展。我尝试了jq的stream函数,但是在重建结构时,进程会占用内存。
我正在寻找一种方法来重新格式化一个json文件,它的行长度超过2GB,不需要将整个文件加载到内存中。
这可以用jq实现吗?
[50GB测试文件](https://webtpa-public-access.s3.us-west-2.amazonaws.com/subfolder/2023_06_430_65B0_in_network_rates.json.gz

0md85ypi

0md85ypi1#

我的理解是JSON只能在双引号字符串中包含转义双引号。这让我相信在"key":"value"的内容后面追加换行符是安全的。
如果你可以选择一个足够频繁出现的键/值对,那么你可以使用gawk来插入换行符。
举一个“标准”的例子,它似乎经常出现在你的测试文件中:

gawk -v RS='"negotiation_arrangement":"(ffs|bundle|capitation)"' \
     'ORS=RT"\n"' <infile >outfile

在每次出现该正则表达式后插入一个换行符。
gawk read一次读取一个记录,由RS中的regex分隔,并将ORS设置为实际字符串(RT),后跟换行符。由于ORS赋值结果总是“真值”,因此会发生默认的打印操作。
内存使用量将是正则表达式出现之间的最大长度的某个小倍数。
对于提供的测试文件,我5年前的笔记本电脑花了半个小时运行zcat | gawk | wc -l,而我正在使用机器做其他事情,需要小于44 MB的虚拟内存,是CPU绑定的,最后报告了333443行。zcat | wc -c花了5分钟。

相关问题