基于其他RDD的值更新RDD

时间:2016-08-10 12:59:41

标签: scala apache-spark functional-programming apache-spark-mllib

我想根据另一个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,有数百万条用于更新。

1 个答案:

答案 0 :(得分:0)

您可以这样做:

val res: RDD[(Integer, Integer)] = 
  rdd1.leftOuterJoin(rdd2)
      .mapValues { case (v, wOpt) => wOpt.getOrElse(v) }