我有一个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。
答案 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