迭代Pyarrow Table的最快方法

时间:2018-11-05 15:37:40

标签: pandas pyarrow

我正在使用Pyarrow库来最佳存储Pandas DataFrame。我需要尽可能快地逐行处理pyarrow表,而不将其转换为pandas DataFrame(它不适合内存)。熊猫有iterrows()/ iterrtuples()方法。除了for循环和索引寻址之外,是否有任何其他快速迭代Pyarrow Table的方法?

3 个答案:

答案 0 :(得分:1)

该软件目前尚未针对此用例进行任何优化。我建议使用Cython或C ++或逐行与数据进行交互。如果您还有其他疑问,请访问开发人员邮件列表dev@arrow.apache.org

答案 1 :(得分:0)

此代码对我有用:

for batch in table.to_batches():
    d = batch.to_pydict()
    for c1, c2, c3 in zip(d['c1'], d['c2'], d['c3']):
        # Do something with the row of c1, c2, c3

答案 2 :(得分:0)

如果将大型实木复合地板数据集拆分为多个文件,则这似乎相当快且内存高效。

import argparse
import pyarrow.parquet as pq
from glob import glob


def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument('parquet_dir')
    return parser.parse_args()


def iter_parquet(dirpath):
    for fpath in glob(f'{dirpath}/*.parquet'):
        tbl = pq.ParquetFile(fpath)

        for group_i in range(tbl.num_row_groups):
            row_group = tbl.read_row_group(group_i)

            for batch in row_group.to_batches():
                for row in zip(*batch.columns):
                    yield row


if __name__ == '__main__':
    args = parse_args()

    total_count = 0
    for row in iter_parquet(args.parquet_dir):
        total_count += 1
    print(total_count)