2017-06-14 22 views
0

我是Spark Scala的新成員,我想使用兩個數據框或RDD計算相似性變量。我沒有兩者之間的共同關鍵,我做了笛卡爾連接,但加入的Df是巨大的。是否有可能從兩個DF中計算一個新變量而不加入它們?Group使用Spark Scala的兩個不同數據框中的兩個不同鍵不加入

如:

df1.show 
+----+------------+------+ 
| id1|        food| level| 
+----+------------+------+ 
|id11|       pasta| first| 
|id11|       pizza|second| 
|id11|   ice cream| first| 
|id12|     spanish| first| 
|id12|   ice cream|second| 
|id13|  fruits| first| 
+----+------------+------+ 
df2.show 
+----+---------+ 
| id2|     food| 
+----+---------+ 
|id21|    pizza| 
|id21|   fruits| 
|id22|    pasta| 
|id22|    pizza| 
|id22|ice cream| 
+----+---------+ 

對於來自各DF1 ID1,我想通過ID2環食變量從DF2分組。
我想要得到這個輸出中:

+----+----+----------------+ 
| id1| id2|count_similarity| 
+----+----+----------------+ 
|id11|id21|               1|id11 and id21 have only "pizza' in common 
|id11|id22|               3| 
|id12|id21|               0| 
|id12|id22|               1| 
|id13|id21|               1| 
|id13|id22|               0| 
+----+----+----------------+ 

是否有可能來計算這個使用上RDD地圖句子? 謝謝

回答

0

可以兩個數據幀轉換爲rdd,使用cartesian的方法來計算每個ID對之間的相似性,然後重建數據幀:

case class similarity(id1: String, id2: String, count_similarity: Int) 

val rdd1 = df1.rdd.groupBy(_.getString(0)).mapValues(_.map(_.getString(1)).toList)  
val rdd2 = df2.rdd.groupBy(_.getString(0)).mapValues(_.map(_.getString(1)).toList) 

rdd1.cartesian(rdd2).map{ 
    case (x, y) => similarity(x._1, y._1, x._2.intersect(y._2).size) 
}.toDF.orderBy("id1").show 

+----+----+----------------+ 
| id1| id2|count_similarity| 
+----+----+----------------+ 
|id11|id22|    3| 
|id11|id21|    1| 
|id12|id21|    0| 
|id12|id22|    1| 
|id13|id21|    1| 
|id13|id22|    0| 
+----+----+----------------+ 
+0

謝謝Psidom回答我的問題 –

0

將這項工作嗎?

df1.registerTempTable("temp_table_1") 
df2.registerTempTable("temp_table_2") 

spark.sql(
    """SELECT id1, id2, count(*) AS count_similarity FROM temp_table_1 AS t1 
    | JOIN temp_table_2 AS t2 ON (t1.food = t2.food) 
    | GROUP BY id1, id2 
    | ORDER BY id1, id2""".stripMargin 
).show 
+0

是的,謝謝semsorock –

相關問題