2014-11-12 2 views
1

샘플 데이터 세트의 다음 행의 키 필드로, 이전 행의 키를 복사합니다 :어떻게 키 - 값 쌍 RDD

$, Claw   "OnCreativity" (2012) [Himself] 

$, Homo   Nykytaiteen museo (1986) [Himself] <25> 
      Suuri illusioni (1985) [Guests] <22> 

$, Steve  E.R. Sluts (2003) (V) <12> 

$hort, Too  2012 AVN Awards Show (2012) (TV) [Himself - Musical Guest] 
      2012 AVN Red Carpet Show (2012) (TV) [Himself] 
      5th Annual VH1 Hip Hop Honors (2008) (TV) [Himself] 
      American Pimp (1999) [Too $hort] 

나는를 사용하여 같은 키 - 값 쌍 RDD을 만들었습니다 다음 코드를

To split data: val actorTuple = actor.map(l => l.split("\t")) 
To make KV pair: val actorKV = actorTuple.map(l => (l(0), l(l.length-1))).filter{case(x,y) => y != "" } 

키 - 값 RDD 콘솔 출력 :

Array(($, Claw,"OnCreativity" (2012) [Himself]), ($, Homo,Nykytaiteen museo (1986) [Himself] <25>), ("",Suuri illusioni (1985) [Guests] <22>), ($, Steve,E.R. Sluts (2003) (V) <12>)....... 

그러나,이 ""키 즉, 빈 등 (을 참조 라인의 많은이 위의 RDD 출력), 데이터 집합의 특성 때문에 이전 행의 액터가 비어있는 경우이 행에 복사하는 기능이 필요합니다. 어떻게 수행 할 수 있습니다.

답변

1

Spark and Scala에 새로 추가되었습니다. 그러나 아마도 선의 구문 분석을 변경하는 것이 더 간단 할 것이고, 먼저 list 유형의 값을 가진 한 쌍의 RDD를 생성하십시오.

($, 호모, (Nykytaiteen의 박물관 (1986) [자신] < 25>, Suuri illusioni (1985) [손님] < 22>)) 나는 당신의 데이터를 모르는

, 그러나 아마 경우 한 줄은 값 목록에 추가하는 "$"로 시작하지 않습니다.

그러면 원하는대로 위에서 설명한 RDD 쌍에서 flatMapValues ​​(func)를 사용할 수 있습니다. 이 함수는 반복자 쌍을 반환하는 함수를 적용하고 반환 된 각 요소에 대해 이전 키가있는 키 - 값 항목을 생성합니다.

ADDED : 입력 데이터 ("샘플 데이터 세트")는 어떤 형식입니까? 그것은 텍스트 파일 또는 .tsv입니까? 전체 파일을 한 번에로드하려고합니다. 즉, .textFile() 대신 .wholeTextFiles()를 사용하여 데이터를로드하십시오. 이것은 레코드가 파일의 둘 이상의 행에 저장되기 때문입니다.

ADDED 파일을 다운로드하지는 않지만 관심있는 각 레코드는 "$"로 시작됩니다. Spark는 Hadoop 입력 형식으로 작업 할 수 있으므로 샘플 데이터에 적합한 형식이 있는지 확인하십시오.

그렇지 않은 경우 '\ n'문자 인 TextFiles의 기본값 대신 파일을이 문자로 분리 된 파일로 구문 분석하는 자체 Hadoop InputFormat 구현을 작성할 수 있습니다. 아이디어 XYZZY에서 계속

+0

되어 최종 결과의 형식은 배우 이름의 일부로 바뀌므로 정상적인 논리에서는 사용할 수 없습니다. –

+0

설명 된 논리는 교환 가능하지 않습니다. RDD 요소는 여러 컴퓨터로 분할됩니다. 이전 키 요소가 다른 컴퓨터에 있으면 어떻게 될까요? 또한 RDD 데이터 구조가 정렬되지 않는다고 생각합니다. 필자는 파일을 RDD 쌍으로 구문 분석하는 구문 분석 논리를 사용하는 것이 더 간단 할 것이라고 생각했습니다. 배우 이름의 키와 배우가 있던 모든 영화 목록의 값이 필요했습니다. 원하는 모든 논리 Spark RDD API에 적용하면 파일을 파싱하고 기본 RDD를 만들 때 적용 할 수있을 것입니다. – xyzzy

+0

저는 파일을 RDD 쌍으로 구문 분석하는 파싱 로직을 갖고 싶습니다. 키는 액터 이름으로 사용하고 값은 액터가 들어있는 모든 동영상의 목록으로,하지만 데이터 세트를 파싱 할 때 아래 링크에서 다운로드), 우리는 쌍을 이루기 위해 라인을 필드로 분리해야하기 때문에 값 & 액터로 영화 목록을 키로 추출 할 수 없습니다. 또한 탭으로 구분 된 데이터 세트를 사용하고 .wholeTextFiles()를 사용하면 RDD에서 단 한 줄만 가져옵니다. 비어있는 경우 이전 줄의 키를 복사하는 사용자 정의 함수를 제안합니다. –

1

에 대해 당신이 문자열로 파일에로드 한 후 이것을 시도하는 방법, 준 :

val actorFileSplit = actorsFile.split("\n\n") 
val actorData = sc.parallelize(actorsFileSplit) 
val actorDataSplit = actorsData.map(x => x.split("\t+",2).toList).map(line => (line(0), line(1).split("\n\t+").toList)) 

내가 뭘하는지 설명하기 위해, 나는 모든 시간을 문자열을 분할하여 시작하는 우리 줄 바꿈을 찾으십시오. 연속적으로 이것을 맵핑 함수에 대한 sparkcontext로 병렬 처리합니다. 그런 다음 모든 항목을 두 개 부분으로 나눕니다.이 부분은 여러 탭 중 첫 번째 발생 (하나 이상)으로 구분됩니다. 첫 번째 부분은 이제 배우가되어야하고 두 번째 부분은 여전히 ​​영화 제목이있는 문자열이어야합니다. 두 번째 부분은 새로운 줄마다 다시 여러 줄로 나눌 수 있습니다. 이렇게하면 모든 배우의 모든 제목이있는 목록이 만들어집니다.난 당신이 "$"를 코드/명령의 측면에서 동일한에 대한 예를 제공하고,시겠습니까, 또한 스칼라 스파크 및 새로운 오전

actorDataSplit = [(String, [String])] 

행운