2016-10-16 3 views
4

위 코드를 스파크 드라이버로 사용하고 프로그램을 실행하면 필요한 데이터를 마루 파일로 올바르게 저장합니다.Spark Java Map 함수가 두 번 실행됩니다.

 String indexFile = "index.txt"; 
     JavaRDD<String> indexData = sc.textFile(indexFile).cache(); 
     JavaRDD<String> jsonStringRDD = indexData.map(new Function<String, String>() { 
     @Override 
     public String call(String patientId) throws Exception { 
     return "json array as string" 
     } 
     }); 

//1. Read json string array into a Dataframe (execution 1) 
     DataFrame dataSchemaDF = sqlContext.read().json(jsonStringRDD); 
//2. Save dataframe as parquet file (execution 2) 
     dataSchemaDF.write().parquet("md.parquet"); 

하지만 RDD indexData 내 매퍼 기능을 관찰 두 번 실행지고 있습니다. 나는 마루 파일이 나를 인도 할 수

dataSchemaDF을 쓸 때 나는 SQLContext 둘째를 사용하여 DataFramejsonStringRdd을 읽을 때 첫째, 어떻게이 반복 실행을 피하기 위해? json 문자열을 Dataframe으로 변환하는 더 좋은 방법이 있습니까?

+0

어디에 두 개의지도를보고있다? RDD는 느리게 평가됩니다. 'map' 연산은 하나의 변환이 아니라 동작이므로,'jsonStringRDD'의 할당은 즉시 실행되어서는 안됩니다. 데이터 프레임을 읽고 마루에 쓰는 실행 경로는 모두 RDD를 수집해야합니다. –

+0

매퍼 (mapper) 함수에 로깅 문이 있는데, 로그에 두 번 표시됩니다. – blob

답변

6

이유는 JSON 독자를위한 스키마가 부족하다고 생각합니다. 당신이 실행하면 :

sqlContext.read().json(jsonStringRDD); 

스파크는 새로 DataFrame 생성 된 스키마를 추론 할 수있다.

StructType schema; 
... 

때 사용 : 당신이 JSON 문서의 모양을 설명하는 StructType을 만들 필요가 스캔 입력 RDD을 가지고 있으며, 당신이 그것을 피하려면이 단계가 열심히

을 수행 할합니다 당신은 DataFrame를 만듭니다

DataFrame dataSchemaDF = sqlContext.read().schema(schema).json(jsonStringRDD); 
관련 문제