Чтение большого сжатого файла json с помощью pyarrow аналогично функциональности pandas reader

У меня есть большой сжатый файл 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 я изучал функциональность входного потока, аналогичную программе чтения файлового потока, но не был уверен, что это правильный маршрут.

Любые рекомендации приветствуются.


person Nick    schedule 05.11.2020    source источник


Ответы (1)


Это похоже на https://issues.apache.org/jira/browse/ARROW-10372. Начиная с версии 2.0.0, функция набора данных не поддерживает чтение сжатых файлов CSV или JSON. Не могли бы вы прокомментировать свой вариант использования по этой проблеме?

person Neal Richardson    schedule 05.11.2020
comment
Привет, Нил, добавлю к вопросу, спасибо за ответ! Мне интересно, если в pyarrow вообще нет способа сделать это, независимо от того, использует ли он новые функции набора данных или нет? Я бы подумал, что я мог бы разделить файл аналогичным образом на таблицы со стрелками, а не на фреймы данных, но, возможно, это не так. - person Nick; 06.11.2020
comment
Программа чтения CSV, указанная стрелкой, имеет параметр потоковой передачи (см. arrow.apache.org /docs/python/csv.html#incremental-reading), однако я не вижу ничего похожего на то, что в настоящее время реализовано для JSON. - person joris; 11.11.2020
comment
@joris спасибо за это, как вы упомянули, в настоящее время не для JSON, а также всегда однопоточный, поэтому я не уверен, что увижу большой прирост производительности от панд, но, возможно,. Я добился некоторого прогресса, теперь получаю исключение Превышено максимальное количество строк при чтении. - person Nick; 13.11.2020