У меня есть большой сжатый файл json, размер которого в несжатом виде составляет около 128 ГБ в виде одного файла. При сжатии .gz размер файла составляет около 21 ГБ. Я хотел бы использовать pyarrow для чтения файла по частям и преобразования в набор данных паркета. Я хотел имитировать функциональность читателя panda, но столкнулся с некоторыми проблемами.
У меня работает следующий код, в котором сжатый файл json считывается через pandas read_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 напрямую, без необходимости сначала извлекать фрагменты данных pandas, а затем выводить их в таблицу стрелок apache. В первую очередь я хотел бы добиться некоторого прироста производительности, учитывая возможность многопоточного чтения с помощью стрелки apache по сравнению с pandas read_json.
Я попытался использовать ReadOptions класса pyarrow.json (https://arrow.apache.org/docs/python/generated/pyarrow.json.ReadOptions.html#pyarrow.json.ReadOptions) однако, когда я запускаю следующий код, он появляется для меня эта стрелка apache сначала распаковывает весь файл в памяти перед его чтением в соответствии с размером блока, который я установил в параметре 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
я изучал функциональность входного потока, аналогичную программе чтения файлового потока, но не был уверен, что это правильный маршрут.
Любые рекомендации приветствуются.