2016-10-16 13 views
4

上記のコードをスパークドライバとして使用しています。プログラムを実行すると、パーキングファイルとして必要なデータを適切に保存します。Spark Java Map関数が2回実行されています

 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に私のマッパー機能を観察したが2回実行取得されます。私はSQLContext セカンドを使用してDataFrameとしてjsonStringRddを読んだとき、私はdataSchemaDF

寄木細工のファイルに書き込みをする際 まず、あなたはこの繰り返し実行を避けるために、どのように、この上で私を導くことはできますか? jsonの文字列をDataframeに変換する他の方法がありますか?

+0

どこに2つのマップがありますか? RDDは遅れて評価されます。 'map'操作は変換であり、アクションではないので、' jsonStringRDD'の割り当ては直ちに実行されるべきではありません。おそらく、Dataframeを読み込んで寄木細工に書き込むための実行パスは両方とも、RDDの収集を必要とします。 –

+0

私はマッパー関数内にロギングステートメントを持っていますが、ログに2回表示されます。 – blob

答えて

6

理由はJSONリーダーのスキーマが不足していると思います。あなたが実行すると:

sqlContext.read().json(jsonStringRDD); 

スパークは、新しく作成されたDataFrameのスキーマを推測する必要があります。

​​

とするとき、それを使用する:あなたはJSON文書の形状を説明するStructTypeを作成する必要があり、それはスキャン入力RDDを持っており、あなたはそれを避けたい場合は、このステップは熱心に

を行っていることを行うために、あなたは DataFrameを作成します:

関連する問題