我有一个很大的压缩json文件,未压缩的单个文件大约有128GBs。使用.gz压缩时,文件大小约为21 is。我想利用pyarrow以块的形式读取文件,并将其转换为拼图数据集。我想模仿panda的阅读器功能,但遇到了一些问题。
我有以下代码,其中压缩的json文件通过pandas read_json读入块中,然后将这些块转换为apache箭头表,然后写出到parquet数据集:
reader = pd.read_json("file.json.gz", lines=True, chunksize=5000000)
for chunk in reader:
arrow_table = pa.Table.from_pandas(chunk,nthreads=4)
pq.write_to_dataset(arrow_table,root_path="dir")
这段代码得到了我想要的结果,但是我想直接使用apache arrow,而不必先进入分块的pandas数据帧,然后再转到apache箭头表。首先,我希望在性能上有所提升,因为与pandas read_json相比,apache arrow的多线程读取能力更强。
我曾尝试使用pyarrow.json类的ReadOptions (https://arrow.apache.org/docs/python/generated/pyarrow.json.ReadOptions.html#pyarrow.json.ReadOptions),但是,当我运行以下代码时,我发现apache arrow在按照我在block_size参数中设置的块大小读取文件之前,会先解压缩内存中的整个文件,如果我让代码运行,文件的大小会出现内存不足错误。
from pyarrow import json
opts = json.ReadOptions(block_size=4096)
with json.read_json('file.json.gz',opts) as f:
table = f
pq.write_to_dataset(table, root_path='dir')
代替with json.read_json
,我研究了类似于文件流读取器的输入流功能,但不确定这是否是正确的路线。
欢迎任何建议。
发布于 2020-11-06 06:22:00
这听起来和https://issues.apache.org/jira/browse/ARROW-10372很相似。从2.0.0版本开始,dataset功能不支持读取压缩的CSV或JSON文件。你介意评论一下你在这个问题上的用例吗?
https://stackoverflow.com/questions/64705943
复制相似问题