У меня большие файлы CSV, которые мне в конечном итоге хотелось бы преобразовать в паркет. Pandas не поможет из-за ограничений памяти и его сложности обработки значений NULL (которые распространены в моих данных). Я проверил документы PyArrow и инструменты для чтения паркетных файлов, но ничего не видел о чтении CSV. Я что-то пропустил, или эта функция как-то несовместима с PyArrow?
Мы работаем над этой функцией, сейчас есть запрос на перенос: https://github.com/apache/arrow/pull/2576. Вы можете помочь, проверив это!
Вы можете читать 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()