首页 > 解决方案 > 如何使用reduce函数而不是groupby来聚合Dataframe上多列的总和?

问题描述

如何使用reduce函数而不是groupby来聚合Dataframe上多列的总和?因为,groupby sum 花费了很多时间,现在我正在考虑使用 reduce 函数。任何线索都会有所帮助。

Input:

| A | B | C | D |
| x | 1 | 2 | 3 |
| x | 2 | 3 | 4 |

CODE:

    dataFrame.groupBy("A").sum()

Output:

| A | B | C | D |
| x | 3 | 5 | 7 |

标签: scalaapache-spark

解决方案


您必须将其转换DataFrameRDD才能执行reduceByKey操作。

val rows: RDD[Row] = df.rdd

创建 RDD 后,您可以使用 reduceByKey 添加多个列的值

val input =  sc.parallelize(List(("X",1,2,3),("X",2,3,4)))
input.map{ case (a, b, c, d) => ((a), (b,c,d)) }.reduceByKey((x, y) => (x._1 + y._1, x._2 + y._2, x._3 + y._3))


spark.createDataFrame(final_rdd).toDF("M","N").select($"M", $"N._1".as("X"), $"N._2".as("Y"),$"N._3".as("Z")).show(10)

+---+---+---+---+
|  M|  X|  Y|  Z|
+---+---+---+---+
|  X|  3|  5|  7|
+---+---+---+---+


推荐阅读