Читать CSV с PyArrow

1

У меня большие файлы CSV, которые мне в конечном итоге хотелось бы преобразовать в паркет. Pandas не поможет из-за ограничений памяти и его сложности обработки значений NULL (которые распространены в моих данных). Я проверил документы PyArrow и инструменты для чтения паркетных файлов, но ничего не видел о чтении CSV. Я что-то пропустил, или эта функция как-то несовместима с PyArrow?

Теги:
pyarrow

2 ответа

4
Лучший ответ

Мы работаем над этой функцией, сейчас есть запрос на перенос: https://github.com/apache/arrow/pull/2576. Вы можете помочь, проверив это!

0

Вы можете читать CSV порциями с помощью pd.read_csv(chunksize=...), а затем записывать порции с помощью Pyarrow.

Единственное предостережение: как вы упомянули, Pandas будет выдавать несовместимые dtypes, если у вас есть столбец, в котором все пустые значения в одном чанке, поэтому вы должны убедиться, что размер чанка больше, чем самый длинный цикл нулевых значений в ваших данных.

Это читает CSV из стандартного ввода и записывает Parquet в стандартный вывод (Python 3).

#!/usr/bin/env python
import sys

import pandas as pd
import pyarrow.parquet

# This has to be big enough you don't get a chunk of all nulls: https://issues.apache.org/jira/browse/ARROW-2659
SPLIT_ROWS = 2 ** 16

def main():
    writer = None
    for split in pd.read_csv(sys.stdin.buffer, chunksize=SPLIT_ROWS):
        table = pyarrow.Table.from_pandas(split, preserve_index=False)
        # Timestamps have issues if you don't convert to ms. https://github.com/dask/fastparquet/issues/82
        writer = writer or pyarrow.parquet.ParquetWriter(sys.stdout.buffer, table.schema, coerce_timestamps='ms', compression='gzip')
        writer.write_table(table)
    writer.close()

if __name__ == "__main__":
    main()

Ещё вопросы

Сообщество Overcoder
Наверх
Меню