如何在火花中使用 scala 计算两个数据帧的值



我有两个数据帧,两个数据帧的计数相同,我想得到两个数据帧中每个值的总和 这是输入:

+---+  and       +---+
|df1|            |df2|
+---+            +---+
| 11|            |  1|
| 12|            |  2|
| 13|            |  3|
| 14|            |  4|
| 15|            |  5|
| 16|            |  6|
| 17|            |  7|
| 18|            |  8|
| 19|            |  9|
| 20|            | 10|
+---+            +---+

这是我的代码:

val df1 = sc.parallelize(1 to 10,2).toDF("df1")
val df2 = sc.parallelize(11 to 20,2).toDF("df2")
val df3=df1.rdd.zip(df2.rdd).map(x=>{
x._1.getInt(0)+x._2.getInt(0)
}).toDF("result")
df3.show()

结果是:

+-----+
|result|
+-----+
|   12|
|   14|
|   16|
|   18|
|   20|
|   22|
|   24|
|   26|
|   28|
|   30|
+-----+

我必须将数据帧更改为rdd然后压缩两个rdd,如何计算两个不转换为rdd的数据帧?

您可以简单地使用Window函数来创建用于连接两个dataframesrow_number。连接后只需对两列求和即可。

import org.apache.spark.sql.expressions.Window
import sqlContext.implicits._
import org.apache.spark.sql.functions._
val df1 = sc.parallelize(1 to 10,2).toDF("df1")
val df2 = sc.parallelize(11 to 20,2).toDF("df2")
df1.withColumn("rowNo", row_number() over Window.orderBy("df1"))
.join(df2.withColumn("rowNo", row_number() over Window.orderBy("df2")), Seq("rowNo"))
.select(($"df1"+$"df2").alias("result"))
.show(false)

您可以使用 monotonically_increasing_id(( 为数据帧和连接提供 id,并添加两列。

import spark.implicits._
val df1 = spark.sparkContext.parallelize(11 to 20).toDF("df1")
val df2 = spark.sparkContext.parallelize((1 to 10 )).toDF("df2")
df1.withColumn("id", monotonically_increasing_id())
.join(df2.withColumn("id", monotonically_increasing_id()), "id")
.withColumn("result", ($"df1" + $"df2")).drop("id").show

输出:

+---+---+------+
|df1|df2|result|
+---+---+------+
| 11|  1|    12|
| 18|  8|    26|
| 17|  7|    24|
| 20| 10|    30|
| 16|  6|    22|
| 12|  2|    14|
| 14|  4|    18|
| 19|  9|    28|
| 13|  3|    16|
| 15|  5|    20|
+---+---+------+

希望这有帮助!

最新更新