2017-12-14 1 views
3

내 텍스트 파일에서 이러한 라인 데 사용하여 각 행에서 특정 요소를 찾을 수 :어떻게 foreach 문을 사용하여 JavaRDD를 반복하고 스파크 자바

Some different lines.... 

Name : Praveen 
Age : 24 
Contact : 1234567890 
Location : India 

Some different lines.... 

Name : John 
Contact : 1234567890 
Location : UK 

Some different lines.... 

Name : Joe 
Age : 54 
Contact : 1234567890 
Location : US 

일부 다른 선이 나타내는 것은 그 사이에 다른 정보입니다 .

이제 파일을 읽고 사람 정보를 추출해야합니다. 누락 된 키가 있으면 빈 문자열로 읽어야합니다 (두 번째 사람 정보에 연령이 없음).

JavaRDD<String> data = jsc.textFile("person.report"); 

List<String> name = data.filter(f -> f.contains("Name")).collect(); 
List<String> age = data.filter(f -> f.contains("Age")).collect(); 
List<String> contact = data.filter(f -> f.contains("Contact")).collect(); 
List<String> location = data.filter(f -> f.contains("Location")).collect(); 

위와 같은 방법으로 for 루프를 반복하면 세 번째 사람의 나이가 두 번째 사람에게 할당됩니다.

답변

2

먼저 드라이버의 모든 것을 수집하고 있습니다. 원하는대로 할 수 있습니까? 큰 데이터 세트에서는 작동하지 않습니다 ...

기본적으로 문제는 레코드로 간주되는 것이 한 줄에 없다는 것입니다. 기본적으로 spark는 각 행을 별도의 레코드로 간주합니다. 그러나 여기에 기록은 여러 줄에 있습니다 (이름, 나이, 위치 ...). 이 문제를 극복하려면 다른 구분 기호를 찾아야합니다. "일부 다른 라인"에서, 특정 문자열이 있으면, 그것을 사용하고이 속성 설정 :

sc.hadoopConfiguration.set("textinputformat.record.delimiter","specific string") 

는 그런 다음과 같이 쓸 수있다 : 사람에 해당하는

val cols = Seq("Name","Age", "Contact", "Location") 
sc.textFile("...") 
    .map(_.split("\n")) 
    .map(x => cols 
     .map(col => x.find(_.startsWith(col)).getOrElse(col+" :"))) 

모든 라인을 것입니다 자신이 원하는대로 처리 할 수 ​​있도록 동일한 기록에 있어야합니다. 적절한 구분 기호를 찾을 수없는 경우 레코드에 모두 이름이있을 수 있으므로 "이름 :"을 사용할 수 있습니다.

java8에서 스트림을 사용하여 같은 방식으로 구현할 수 있습니다.

String[] array = {"Name", "Age", "Contact", "Location"}; 
List<String> list = Arrays.asList(array); 
sc.textFile("...") 
    .map(x -> Arrays.asList(x.split("\n"))) 
    .map(x -> list.stream() 
        .map(col -> x.stream() 
           .filter(line -> line.startsWith(col)) 
           .findAny() 
           .orElse(col+" :")) 
        .collect(Collectors.toList())); 
+0

내가 당신이 어떤 자바 코드가있는 경우 –

+0

공유 나는 다음과 같은 자바 버전을 추가하십시오, 스칼라에 대한 지식이 돈't :이 질문은 자바에 대한 질문을 받았다 이후 좀 더 자세한 더있다 가고있다 같은 논리. 그래도 textinputformat.record.delimiter를 변경하는 아이디어가 있습니까? 그것이 정말로 중요합니다. – Oli

+0

는 구분 기호없이 가능합니까 ?? –

관련 문제