Apache spark 转换GroupBy+;聚合到groupByKey

Apache spark 转换GroupBy+;聚合到groupByKey,apache-spark,pyspark,spark-dataframe,Apache Spark,Pyspark,Spark Dataframe,我使用的DF如下所示: +-------+-------------+ |A |B | |1 |"foo" | |1 |"bar" | |1 |"foobar" | |2 |"bar" | |2 |"foo" | +-------+-----------------+ |A |B | |1 |"foo

我使用的DF如下所示:

+-------+-------------+
|A      |B            |
|1      |"foo"        |
|1      |"bar"        |
|1      |"foobar"     |
|2      |"bar"        |
|2      |"foo"        |
+-------+-----------------+
|A      |B                |
|1      |"foo/bar/foobar" |
|2      |"bar/foo"        |
我想把它变成这样:

+-------+-------------+
|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


谢谢大家!

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

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

因此,现在:尽可能使用groupBy+agg,它在大多数情况下都是最快的解决方案

Spark SQL效率较低的一种情况是TreeAgregate—目前Spark SQL中没有这样的API,而Spark Core在需要树聚合时速度更快。然而,社区现在也在研究数据集和数据帧中的树聚合


正如注释中提到的@user8371915,在您的情况下,没有什么可减少的-groupBy的工作原理与RDD.groupByKey完全相同,因为它无法从Dataset或DataFrame聚合值。然而,关键点仍然是一样的-Spark SQL groupBy将选择如何进行分组

感谢大家提供这些信息