如何使用Spark RDD生成或映射到另一个RDD

时间:2017-05-01 21:20:08

标签: scala apache-spark mapreduce

我有一个Key / Value RDD我想采取这个"迭代"其中的实体,键/值,以及创建或映射到另一个RDD,该RDD可能具有与第一个RDD相同的条目。

示例:

我在accumulo中有记录表示对绘画中颜色的观察。 观察实体/对象保存有关绘画名称和绘画中颜色的数据。

Observation
public String getPaintingName() {return paintingName;}
public List<String> getObservedColors() {return colorList}

我将来自accumulo的观察结果作为RDD提取到我的代码中。

val observationRDD: RDD[(Text, Observation)] = getObservationsFromAccumulo();

我想采用这个RDD并创建一个(Color,paintingName)形式的RDD,其中键是观察到的颜色,值是观察颜色的绘画名称。

 val colorToPaintingRDD: RDD[(String, String)] = observationRDD.somefunction({ case (_, observation) =>
    for(String color : observations.getObservedColors()) {
       // Some how output a entry into a new RDD
       //output/map (color, observation.getPaintingName)
 })

我知道地图无法正常工作,因为它的1对1,我想也许是ObservationRDD.flatmap(某些功能),但似乎找不到任何关于如何创建新的示例,更大或更小,RDD。

有人可以帮助我并告诉我flatmap是否正确,如果是这样,请使用我提供的这个例子给我一个例子,或告诉我我是否会离开基地?

请理解这只是一个简单的例子,它不是我要问的内容,它是如何将RDD转换为具有更多或更少条目的RDD。

1 个答案:

答案 0 :(得分:0)

您应该使用flatmap并在RDD中返回List [(String,String)] foreach元素。 FlatMap会使结果平坦,你会得到一个RDD [(String,String)]

我没有尝试过代码,但它会是这样的:

val colorToPaintingRDD: RDD[(String, String)] = observationRDD.flatMap { case (_, observation) =>
    observations.getObservedColors().map(color => (color, observation.getPaintingName))
}

如果getObservedColors方法在Java中,您必须导入JavaConversions并更改为scala列表。

import scala.collection.JavaConversions._
observations.getObservedColors().toList