2017-05-01 2 views
0

키/값 RDD가 있습니다. 키/값의 엔티티를 "반복 실행"하고 키/값을 만들고 다른 것으로 작성 또는 매핑하려고합니다. 첫 번째 RDD보다 더 많거나 적은 항목을 가질 수있는 RDD.Spark RDD를 사용하여 다른 RDD를 생성하거나 매핑하는 방법

예 :

나는 그림에서 색상의 관찰을 대표 accumulo의 기록을 가지고있다. 관찰 개체/개체는 그림의 그림 이름과 색에 대한 데이터를 보유합니다.

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

관측치를 누적 (accumulo)에서 내 코드로 RDD로 가져옵니다.

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

나는이 RDD을 가지고 키가 색이 관찰 값이 색상에서 관찰 된 그림의 이름입니다 (컬러, 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

플랫 맵을 사용하고 RDD에서 List [(String, String)] foreach 요소를 반환해야합니다. FlatMap 것이다 평면 결과와 내가 코드를 시도하지 않았다

RDD [(문자열, 문자열)]를 얻을 것이다,하지만이 같은 것입니다 :

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

getObservedColors 방법 경우 Java에서 JavaConversions를 가져와 스칼라 목록으로 변경해야합니다.

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

이것은 정확히 내가 필요한 것입니다. 감사합니다! – JediKid

관련 문제