Scala 合并两个RDD

Scala 合并两个RDD,scala,apache-spark,Scala,Apache Spark,我是spark的新手,有人能帮我找到一种方法,根据scala中的以下逻辑组合两个rdd来创建最终的rdd,最好不使用sqlcontext(dataframes)- RDD1=column1、column2、column3有362825条记录 RDD2=column2_distinct(与RDD1相同,但包含不同的值),column4有2621条记录 最终RDD=第1列、第2列、第3列和第4列 范例- RDD1= userid | progid | Rating a

我是spark的新手,有人能帮我找到一种方法,根据scala中的以下逻辑组合两个rdd来创建最终的rdd,最好不使用sqlcontext(dataframes)-

RDD1=column1、column2、column3有362825条记录

RDD2=column2_distinct(与RDD1相同,但包含不同的值),column4有2621条记录

最终RDD=第1列、第2列、第3列和第4列

范例-

RDD1=

  userid |  progid  |  Rating
       a       001     5
       b       001     3
       b       002     4
       c       003     2
RDD2=

   progid(distinct) |   id

   001                  1
   002                  2
   003                  3
最终RDD=

    userid  | progid  | id | rating
        a       001      1   5
        b       001      1   3
        b       002      2   4
        c       003      3   2
代码


需要与DF1相同数量的记录,并从DF2(id)附加一个新列,该列具有来自DF2`

的相应programid值,这有点难看,但应该可以工作(Spark 2.0):


我认为更好的选择是使用spark SQL

首先,为什么要拆分、连接并再次拆分行?您只需一步即可完成:

val rowRdd1 = pairrdd1.map{x => 
    val (userid, progid) = x._1.split(",") 
    val rating = x._2
    Row(userid, progid, rating) 
}
我猜您的问题可能是键中有一些附加字符,因此连接中的字符不匹配。一种简单的方法是执行
左连接
并检查不匹配的行

这可能是行中的额外空间,您可以对这两个RDD进行如下修复:

val rowRdd1 = pairrdd1.map{x =>  
    val (userid, progid) = x._1.split(",").map(_.trim)
    val rating = x._2
    Row(userid, progid, rating) 
}

你可以通过一个简单的连接来实现这一点。尝试过这样做,但是连接没有给我正确的记录数。请为问题添加一些代码,以便我们检查逻辑。如果你打算使用数据集或dataframe@jamborta:将sql逻辑添加到问题谢谢,我尝试过这个方法,但是在最终的rdd中没有得到正确数量的记录-
val-groupedrd1=rdd1.map(x=>(x.split(“,”)(1),x))//362825条记录
`val-groupedrd2=rdd2.map(x=>(x.split(“,”,x))//2621条记录(因为只包含键列的唯一值)`
val-cleanJoinRDD=joinRDD.map(x=>x._1+“,+x._2._1.替换(x._1+”,“,”)+“,+x._2._2.替换(x._1+”,“,”)//297条记录
,而我希望cleanJoinRdd具有与rdd1相同数量的记录,即362825条具有相应的值(来自rdd2的键)作为新专栏。为什么你不能使用数据帧/数据集?尝试过使用它。用代码更新了问题。仍然没有得到想要的结果。我的最终目标是将最终rdd输入
org.apache.spark.mllib.recommendation.Rating
方法,但是由于该方法只接受整数作为产品,并且我的值只要17位数字,这就是为什么我必须将其映射到“id”列(向下投射),如果您觉得有更好的方法在ALS的分级方法中输入长类型,请告诉我。@Amit我这里的主要观点是关于用于联接的键中的额外字符。继续问一个关于如何输入
分级
方法的单独问题。
val rowRdd1 = pairrdd1.map{x => 
    val (userid, progid) = x._1.split(",") 
    val rating = x._2
    Row(userid, progid, rating) 
}
val rowRdd1 = pairrdd1.map{x =>  
    val (userid, progid) = x._1.split(",").map(_.trim)
    val rating = x._2
    Row(userid, progid, rating) 
}