我在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?
谢谢!
答案 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将选择如何进行分组