Parquet 文件上 groupby 的最佳实践
Posted
技术标签:
【中文标题】Parquet 文件上 groupby 的最佳实践【英文标题】:Best practice for groupby on Parquet file 【发布时间】:2017-07-09 18:45:44 【问题描述】:我们有一个 1.5BM 的记录,分布在几个 csv 文件中。我们需要对几列进行分组以生成count
聚合。
我们目前的策略是:
-
将它们加载到数据帧中(使用
Dask
或pyspark
)
聚合列以生成 2 列作为 key:value(我们不确定这是否值得)
将文件另存为Parquet
读取Parquet
文件(Dask
或pyspark
)并在数据帧的索引上运行 groupby。
在Parquet
文件上高效分组的最佳做法是什么?
在索引而不是列(或一组列)上执行 groupby 有多大好处?
我们知道有一个partition
可以提供帮助——但在我们的例子中,我们需要对整个数据集进行分组——所以我们认为它不相关。
【问题讨论】:
有什么理由不直接对由 CSV 制作的数据框进行分组吗?你期待做不同的groupbies吗?您的分组列是什么数据类型? 我们有 15 亿条记录(并且还在增长)——因此试图找到最有效的方式来运行 groupby。 groupby 列当前为text
。我们还想将另外两列保存到一个列表中(列内)
【参考方案1】:
如果您使用 count
或 mean
等已知聚合进行 groupby-aggregation,那么您的分区不会产生太大影响。无论如何,这应该相对较快。
如果您使用非平凡的应用功能(例如在每个组上运行 sklearn 模型)进行 groupby-apply,那么如果您存储数据以便分组列在 parquet 中排序,您将获得更快的体验.
编辑:
话虽如此,尽管 groupby-count 并不特别鼓励智能分区,但切换到 Parquet 仍然很好。你会发现你可以更快地阅读相关的专栏。
作为快速免责声明,dask.dataframe 目前不使用 parquet 中的计数统计信息来加速查询,除非在 read_parquet
函数中进行过滤并帮助识别已排序的列。
【讨论】:
我不确定我是否理解。由于我们正在执行count
操作,因此无需设置分区。但是在执行 groupby 操作之前,read_csv
是否还有价值,然后写入parquet
?如果我们想保存键值(=count)对以供将来更新,那么可能/最佳的键值存储格式是什么?以上是关于Parquet 文件上 groupby 的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章