2017-07-07 116 views
0

我哈瓦2個數據幀中,兩個數據幀的計數是一樣的,我想每個值的總和兩個數據幀 這是輸入:如何計算兩個dataframe'value與火花斯卡拉

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

結果是:

我要查nge dataframe到rdd然後zip兩個rdd,如何計算兩個數據幀不轉換爲rdd?

回答

1

您可以簡單地使用Window函數來創建row_number以加入dataframes。加入剛剛總結兩列。

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

有沒有更有效的方法來做到這一點? – mentongwu

+0

窗口將改變分區,如果我使用窗口,我必須重新分區,當我計算它 – mentongwu

+0

是的窗口功能肯定會改變分區。如果不將所有數據都集中在一個分區中,您將如何確保來自df2的11個數據和來自df1的1個數據位於同一個執行程序中。沒有確定所有分區在同一個執行器上,我們不能加入兩個數據框。你的要求就是這樣。 –

0

您可以使用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| 
+---+---+------+ 

希望這有助於!

+0

我希望這有助於! –