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