Spark中的内部地图功能

时间:2014-06-23 21:49:32

标签: scala apache-spark

我有两个RDD:

RDD1[String, Double]

示例数据:

("a" , 1.0)
("b" , 2.0)
("c" , 3.0)
("d" , 4.0)

这对应于键值对。


RDD2[String , (String , String)

示例数据:

("a" , ("b" , "c"))
("b" , ("a" , "b"))
("c" , ("a" , "d"))
("d" , ("a" , "b"))

RDD1包含RDD2

所需的值

所以我希望能够从RDD1中的RDD2访问值,例如:

("a" , ("b" , "c")) will map to ("a" , (2.0 , 3.0))

2.0& 3.0是RDD1

中的对应值

如何使用Scala Spark实现这一目标?可能的解决方案是将RDD1转换为HashMap然后只是“获取” RDD2的Map操作中的值:

RDD2.map(m => RDD1HashMap.get(m._2._1))

有没有其他方法可以实现这一目标?

1 个答案:

答案 0 :(得分:3)

如果RDD1很小,你肯定应该在一个用作广播变量的哈希映射中(疯狂猜测数百万的低十分之一应该没问题)。如果没有,你有两种选择。

  1. 使用PairRDDFunction lookup,这可能是非常低效/非法的(尽管它在本地工作正常)。

    RDD1.cache() RDD2.map(m => RDD1.lookup(m._2._1))

  2. 第二个选项稍微复杂一点,你必须做两个连接(火花仍然不支持一次加入2个以上的数据集)

    val joinedDataSet = RDD2.map((k,v)=> (v._1,(k,v._2))). join(RDD1).map((k,v)=>(v._1._2,(v._2,v._1._1))). join(RDD2).map((k,v)=>(v._1._2(v._1._1,v._2)))

  3. 这应该是您想要的数据集,我意识到RDD非常混乱,您可能想要使用案例类和/或单独进行两个连接然后将这些RDD连接在一起以使其更清晰(如果效率稍低)。还注意到由于某些原因,scala无法对lambdas执行类型推断,我想在尝试使用之前我会尝试其他两个选项中的一个。