我有两个数据帧,两个数据帧的计数相同,我想得到两个数据帧中每个值的总和 这是输入:
+---+ 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
函数来创建用于连接两个dataframes
的row_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|
+---+---+------+
希望这有帮助!