【问题标题】:Fastest way to iterate Pyarrow Table迭代 Pyarrow 表的最快方法
【发布时间】:2019-04-08 23:53:52
【问题描述】:

我正在使用 Pyarrow 库来优化 Pandas DataFrame 的存储。我需要尽可能快地逐行处理pyarrow Table而不将其转换为pandas DataFrame(它不适合内存)。 Pandas 有 iterrows()/iterrtuples() 方法。除了 for 循环和索引寻址,还有什么快速迭代 Pyarrow Table 的方法吗?

【问题讨论】:

    标签: pandas pyarrow


    【解决方案1】:

    目前,该软件根本没有针对这个用例进行优化。我建议使用 Cython 或 C++ 或逐行与数据交互。如果您还有其他问题,请联系开发者邮件列表 dev@arrow.apache.org

    【讨论】:

      【解决方案2】:

      这段代码对我有用:

      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
      

      【讨论】:

        【解决方案3】:

        如果您将大型 parquet 数据集拆分为多个文件,这似乎相当快且内存效率很高。

        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)
        

        【讨论】:

          猜你喜欢
          • 2020-01-16
          • 2013-10-01
          • 2022-06-13
          • 2010-11-08
          • 2023-04-11
          • 2010-09-16
          • 2015-03-07
          • 2018-10-07
          • 1970-01-01
          相关资源
          最近更新 更多