将GroupBy +聚合转换为groupByKey

时间:2017-08-07 11:58:20

标签: apache-spark pyspark spark-dataframe

我在DF上工作:

+-------+-------------+
|A      |B            |
|1      |"foo"        |
|1      |"bar"        |
|1      |"foobar"     |
|2      |"bar"        |
|2      |"foo"        |

我想把它变成这样的东西:

+-------+-----------------+
|A      |B                |
|1      |"foo/bar/foobar" |
|2      |"bar/foo"        |

所以,我写了这段代码:

df.groupby("A")
.agg(concat_ws("/", collect_list(col("B"))))
.collect()

然而,由于我在一个大型DF上工作,因此groupby + agg并不是那么好,并且会进行大量的改组。我做了一些研究,发现ReduceByKey可能更好(减少洗牌)。所以,我的问题是:如何用ReduceByKey替换GrouBy + agg?

谢谢!

1 个答案:

答案 0 :(得分:2)

你不应该替换它。 Spark中的Group By与Spark Core中的Group By Key不同。这是更复杂的操作。

在Spark SQL中,groupBy只需在查询计划中添加一个节点。在查询计划从逻辑计划转换为物理计划期间,将识别其执行方式。 Spark将尽可能地优化分组。

所以,现在:尽可能使用groupBy + agg,这是大多数情况下最快的解决方案。

Spark SQL效率较低的一个案例是treeAggregate - 当前在Spark SQL中没有这样的API,当您需要树聚合时,Spark Core会更快。但是,社区现在也在数据集和数据框中使用树聚合

作为评论中提到的@ user8371915,在您的情况下没有什么可以减少 - groupBy将与RDD.groupByKey完全相同,因为它无法聚合来自Dataset或DataFrame的值。但是,关键点仍然是相同的--Spark SQL groupBy将选择如何进行分组