2017-06-14 25 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 –

相关问题