使用pyarrow读取大型压缩json文件,类似于pandas阅读器功能

问题描述

我有一个很大的压缩json文件,未压缩的单个文件大约为128GB。使用.gz压缩,文件约为21GB。我想利用pyarrow来分批读取文件并将其转换为镶木地板数据集。我想模仿熊猫的阅读器功能,但遇到了一些问题。

我有以下代码工作,其中通过pandas read_json将压缩的json文件读入块中,然后将这些块转换为apache箭头表,然后写出至镶木地板数据集:

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,而不必先拉入大块的熊猫数据帧,然后再提取到apache arrow表中。首先,鉴于apache arrow与pandas read_json的多线程读取功能,我想在性能上有所提高。

我尝试使用pyarrow.json类(https://arrow.apache.org/docs/python/generated/pyarrow.json.ReadOptions.html#pyarrow.json.ReadOptions)的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来研究类似于文件流读取器的输入流功能,但是不确定这是否是正确的路由。

欢迎任何建议。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)