使用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来研究类似于文件流读取器的输入流功能,但是不确定这是否是正确的路由。

欢迎任何建议。

解决方法

这听起来类似于https://issues.apache.org/jira/browse/ARROW-10372。从2.0.0版本开始,数据集功能不支持读取压缩的CSV或JSON文件。您介意在此问题上评论您的用例吗?

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...