我尝试将JSON文件转换为ndJSON,以便我可以将其上传到GCS并将其写入BQ表。我在这里尝试了一切将JSON转换成换行分隔的JSON在Python中,但在我的情况下不起作用,因为我有一个7gb的JSON文件。
我尝试使用这个python代码
import json
with open("input.json", "r") as read_file:
data = json.load(read_file)
result = [json.dumps(record) for record in data]
with open('nd-output.json', 'w') as obj:
for i in result:
obj.write(i+'n')
但是它抬高了
Traceback (most recent call last):
File "my_py_file.py", line 4, in <module>
data = json.load(read_file)
File "/usr/lib/python3.8/json/__init__.py", line 293, in load
return loads(fp.read(),
File "/usr/lib/python3.8/codecs.py", line 322, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
MemoryError
然后我尝试了jq
方法,但仍然没有运气
cat input.json | jq -c '.[]'
它了
1477 broken pipe cat input.json |
1478 killed jq -c '.[]'
我能做些什么来实现我的目标吗?从错误消息中可以清楚地看出,您得到的错误与系统内存的可用性有关。而不是将整个json文件加载到内存中,你可以一次加载一小部分数据,然后你可以加载下一部分,以此类推。请参考下面的代码。在这段代码中,ijson
包用于将json逐部分转换为ndjson。另外,请注意Google并不正式支持ijson
。
import ijson
with open('nd-output.json', 'w') as writefile:
with open('input.json', 'r') as data:
for obj in ijson.items(data, 'item'):
writefile.write(str(obj)+'n')