2014-09-26 10 views
0

RDD[String]Array[String]을 String으로 변환하려면 어떻게해야합니까?RDD [String]을 Array [String]과 연결하여 String을 생성하는 방법은 무엇입니까?

나는 아래의 오류를 얻고있다

,

<console>:34: error: type mismatch; 
found : org.apache.spark.rdd.RDD[String] 
required: String 

아이디어는 SchemaRDD과 /home/tmp/date= 같은 상수 문자열로 날짜 CONCAT 열에서 별개의 날짜를 얻는 것입니다. 그래서 모두 CONCAT해야하며, 출력은

val path = /home/tmp/date=20140901,/home/tmp/date=20140902,/home/tmp/date=20140903,/home/tmp/date=20140904,... so on 

경로가 전체 데이터 집합을 읽어 sc.textFiles(path)에 키가 될 수 있어야합니다.

이 단계에서 데이터를 읽는 동안 변환 오류가 발생합니다.

답변

3

토끼의 한 접근법.

val datesWithPrefixRDD = datesRDD.map(s => prefix + s) 
datesWithPrefixRDD.foreach(println) 

이 생산 : 쉽게

val prefix = "/home/tmp/date=" 
val dates = Array("20140901", "20140902", "20140903", "20140904") 
val datesRDD = sc.parallelize(dates, 2) 

의 접두사를 지퍼로 잠그는있다 : 첫째, 예를 설정

/home/tmp/date=20140901 
/home/tmp/date=20140903 
/home/tmp/date=20140902 
/home/tmp/date=20140904 

하지만 당신은 하나의 문자열에 대해 물었다.

val bad = datesWithPrefixRDD.fold("")((s1, s2) => s1 + ", " + s2) 
println(bad) 

이 생산 :

, , /home/tmp/date=20140901, /home/tmp/date=20140902, , /home/tmp/date=20140903, /home/tmp/date=20140904 

문제는 방법의 불꽃 RDD의 배() 메소드는 필자가 제공 빈 문자열로 연결을 시작하고, 한 번에 대한 명백한 첫 번째 시도는 일부 쉼표 문제가 전체 RDD 및 각 파티션에 대해 한 번. 그러나 우리는 빈 문자열을 처리 할 수 ​​있습니다

val good = datesWithPrefixRDD.fold("")((s1, s2) => 
    s1 match { 
    case "" => s2 
    case s => s + ", " + s2 
    }) 
println(good) 

그런 다음 우리가 얻을 :

/home/tmp/date=20140901, /home/tmp/date=20140902, /home/tmp/date=20140903, /home/tmp/date=20140904 

편집 : 그것은 "여분의 쉼표"문제를 해결하기 때문에는 사실, (감소)는 정돈 답을 생성합니다

다시
val alternative = datesWithPrefixRDD.reduce((s1, s2) => s1 + ", " + s2) 
println(alternative) 

우리가 얻을 :

/home/tmp/date=20140901, /home/tmp/date=20140902, /home/tmp/date=20140903, /home/tmp/date=20140904 
+0

작품, 고마워요 !!! –