Parquet 文件上 groupby 的最佳实践

Posted

技术标签:

【中文标题】Parquet 文件上 groupby 的最佳实践【英文标题】:Best practice for groupby on Parquet file 【发布时间】:2017-07-09 18:45:44 【问题描述】:

我们有一个 1.5BM 的记录,分布在几个 csv 文件中。我们需要对几列进行分组以生成count 聚合。 我们目前的策略是:

    将它们加载到数据帧中(使用Daskpyspark) 聚合列以生成 2 列作为 key:value(我们不确定这是否值得) 将文件另存为Parquet 读取Parquet 文件(Daskpyspark)并在数据帧的索引上运行 groupby。

Parquet 文件上高效分组的最佳做法是什么? 在索引而不是列(或一组列)上执行 groupby 有多大好处? 我们知道有一个partition 可以提供帮助——但在我们的例子中,我们需要对整个数据集进行分组——所以我们认为它不相关。

【问题讨论】:

有什么理由不直接对由 CSV 制作的数据框进行分组吗?你期待做不同的groupbies吗?您的分组列是什么数据类型? 我们有 15 亿条记录(并且还在增长)——因此试图找到最有效的方式来运行 groupby。 groupby 列当前为 text 。我们还想将另外两列保存到一个列表中(列内) 【参考方案1】:

如果您使用 countmean 等已知聚合进行 groupby-aggregation,那么您的分区不会产生太大影响。无论如何,这应该相对较快。

如果您使用非平凡的应用功能(例如在每个组上运行 sklearn 模型)进行 groupby-apply,那么如果您存储数据以便分组列在 parquet 中排序,您将获得更快的体验.

编辑:

话虽如此,尽管 groupby-count 并不特别鼓励智能分区,但切换到 Parquet 仍然很好。你会发现你可以更快地阅读相关的专栏。

作为快速免责声明,dask.dataframe 目前不使用 parquet 中的计数统计信息来加速查询,除非在 read_parquet 函数中进行过滤并帮助识别已排序的列。

【讨论】:

我不确定我是否理解。由于我们正在执行count 操作,因此无需设置分区。但是在执行 groupby 操作之前,read_csv 是否还有价值,然后写入parquet?如果我们想保存键值(=count)对以供将来更新,那么可能/最佳的键值存储格式是什么?

以上是关于Parquet 文件上 groupby 的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

Spark SQL下的Parquet使用最佳实践和代码实战

Spark SQL下的Parquet使用最佳实践和代码实战

Parquet + Spark SQL

S3 中的最佳最大 Parquet 文件大小

在 Spark 中对 RDD 执行 group by 并将每个组写入单独的 Parquet 文件

在tomcat上保存临时文件的最佳实践? [复制]