我有大型 CSV 文件,我最终希望将其转换为镶木地板。由于内存限制和处理 NULL 值的困难(这在我的数据中很常见),Pandas 无济于事。我检查了 PyArrow 文档,并且有用于读取镶木地板文件的工具,但我没有看到任何有关读取 CSV 的信息。我错过了什么,还是这个功能与 PyArrow 不兼容?
问问题
3628 次
2 回答
4
我们正在开发此功能,现在有一个拉取请求:https ://github.com/apache/arrow/pull/2576 。您可以通过测试来提供帮助!
于 2018-09-19T21:28:40.983 回答
2
您可以使用 分块读取 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()
于 2019-01-11T22:25:47.743 回答