我想根据另一个rdd的值更新一个rdd。我尝试过这三种方法: 1.使用左连接 2.使用减去Key然后结合 3.使用地图及其中的条件
然而,提到的三种方法都很慢。
以下是一个例子: rdd1包含一个基于我所拥有的不同userID和productID的rdd。例如,如果我有0到100之间的用户ID,我的产品ID从0到100.我必须最初为所有这些产品评分为0。 rdd1 = [(1,1,0.0),(1,2,0.0),(1,3,0.0),...,(100,100,0.0)]
然后rdd2包含特定userIds和productIds的评级。 rdd2 = [(1,1,3.0),(100,100,4.0)]
我想要的是在矩阵中包含所有userIds和productIds以进行协同过滤,即使没有与之对应的评级。我需要这样做才能在Spark MLLib中使用显式ALS。如果我不打算增加0,我将获得无意义的结果,因为显式代码不包括存在未观察值的情况。因此,它们被认为是缺失而不是零。
简而言之,我想制作这个rdd: rdd = [(1,1,3.0),(1,1,0.0),(1,2,0.0),...,(100,100,4.0)]
对于运行时间最快的方法,你有什么想法吗?我有两个rdd,有数百万条用于更新。
答案 0 :(得分:0)
您可以这样做:
val res: RDD[(Integer, Integer)] =
rdd1.leftOuterJoin(rdd2)
.mapValues { case (v, wOpt) => wOpt.getOrElse(v) }