python - pyspark Window.partitionBy 与 groupBy

标签 python apache-spark pyspark apache-spark-sql

假设我有一个包含大约 21 亿条记录的数据集。

这是一个包含客户信息的数据集,我想知道他们做了多少次。所以我应该对 ID 进行分组并对一列求和(它有 0 和 1 值,其中 1 表示一个 Action )。

现在,我可以使用一个简单的 groupByagg(sum) 它,但据我所知,这并不是很有效。 groupBy 将在分区之间移动大量数据。

或者,我也可以使用带有 partitionBy 子句的 Window 函数,然后对数据求和。缺点之一是我必须应用额外的过滤器,因为它会保留所有数据。我想要每个 ID 一条记录。

但是我看不到这个窗口是如何处理数据的。是不是比这个 groupBy 和 sum.还是一样?

最佳答案

据我所知,在使用 spark DataFrames 时,groupBy 操作通过 Catalyst 进行了优化. DataFrames 上的 groupBy 与 RDD 上的 groupBy 不同。

例如,DataFrames 上的groupBy 首先对分区进行聚合,然后将聚合结果打乱以进行最后的聚合阶段。因此,只有减少的聚合结果会被打乱,而不是整个数据。这类似于 RDD 上的 reduceByKeyaggregateByKey。看到这个相关SO-article有一个很好的例子。

此外,请参阅此 presentation 中的幻灯片 5 Yin Huai 介绍了将 DataFrames 与 Catalyst 结合使用的好处。

最后,我认为您在使用 spark DataFrames 时可以很好地使用 groupBy。使用 Window 似乎不适合我的要求。

关于python - pyspark Window.partitionBy 与 groupBy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47174686/

相关文章:

Pyspark Dataframe 将函数应用于两列

pyspark - 计算 pyspark 中列之间的方差

apache-spark - 为什么 Spark 的 OneHotEncoder 默认删除最后一个类别?

python - 访问 Flask 测试响应中的所有 cookie

python - isinstance ('aaa' , basestring) 和 isinstance ('aaa' , str) 有什么区别?

Python 3.x 按列表中的公共(public)元素对二维列表中的元素进行动态分组

scala - Spark 读取 HBase 与 java.lang.NoSuchMethodError : org. apache.hadoop.mapreduce.InputSplit.getLocationInfo 错误

scala - Spark- 写入 128 MB 大小的 Parquet 文件

python - Pandas 如何获取连续日期和销售额超过 1000 的行?

apache-spark - 如何在大数据平台中比较大文件?