2016-09-22 6 views
0

키/값 쌍 RDD에 대한 질문이 있습니다.키/값 쌍 RDD

movie_horror_Conjuring.txt 
movie_comedy_eurotrip.txt 
movie_horror_insidious.txt 
movie_sci-fi_Interstellar.txt 
movie_horror_evildead.txt 

내가 SC를 사용하여 입력 폴더에있는 파일을 읽기 위해 노력하고 있어요 :

나는 다음과 같이 파일의 내용과 영화의 대화 상자를 가지고 C:/download/input 폴더에 오 개 파일이 있습니다.

(C:/download/input/movie_horror_Conjuring.txt,values) 

을 다음과 같이 내가 키/값을 얻을 wholeTextFiles는() 나는 내가 그룹에 각각의 장르가 함께 groupByKey()를 사용하는 입력 파일을 가지고 작업을 수행하려합니다. 모든 공포 영화의 가치, 함께 코미디 영화 등등.

인가가 나는 한 쌍의 키/값을 (horror, values) 대신 내가 필요로

(C:/download/input/movie_horror_Conjuring.txt,values) 
(C:/download/input/movie_comedy_eurotrip.txt,values) 
(C:/download/input/movie_horror_Conjuring.txt,values) 
(C:/download/input/movie_sci-fi_Interstellar.txt,values) 
(C:/download/input/movie_horror_evildead.txt,values) 

를 다음과 같이 상기 코드 나에게 출력을 제공한다 (C:/download/input/movie_horror_Conjuring.txt,values)

val ipfile = sc.wholeTextFiles("C:/download/input") 
val output = ipfile.groupByKey().map(t => (t._1,t._2)) 

이 방법을 생성 할 수있는 방법 출력은 다음과 같습니다 :

(horror, (values1, values2, values3)) 
(comedy, (values1)) 
(sci-fi, (values1)) 

일부 맵 및 분할 작업을 수행하여 키의 폴더 경로를 제거하여 파일 이름 만 가져 오지만 해당 값을 파일에 추가 할 수는 없습니다.

또한 나는 선이 values1, values2, values3 등의 계산 얻을 수있는 방법을 알고 싶습니다

내 최종 출력해야

같은 (공포, 100)

여기서 100은 값 1 = 40 행, 값 2 = 30 행 및 값 3 = 30 행에있는 행 수의 합계입니다.

답변

1

시험해보기 :

val output = ipfile.map{case (k, v) => (k.split("_")(1),v)}.groupByKey()  
output.collect 

이 기능이 작동하는지 알려주세요.

업데이트 :

(horror, 100)의 형식으로 출력을 얻으려면 :

val output = ipfile.map{case (k, v) => (k.split("_")(1),v.count(_ == '\n'))}.reduceByKey(_ + _)  
output.collect 
+0

그 작업이 도움말 – Ninja

+0

에 대한 감사가 업데이트 된 대답을 확인 @Ninja! – avr

+0

위대한! 이것은 잘 작동합니다. _ == '\ n'을 사용하는 대신 분할을 수행했습니다. 고맙습니다. – Ninja