2016-09-07 8 views
0

RDD[String]から特定フィールドを持つマップのListに特定のフィールドを取得するにはどうすればいいですか?RDD [String]のフィールドをブロードキャストにマップする方法は?

itemId : 1122334 self.preferred : "National Parks" 
itemId : 3444444 self.preferred : "State Parks" 
... 
:私は値( {itemid , self.preferred})としてのみキーとして itemIdself.preferredを持っているマップのリストを取得するにはどうすればよい

{ 
    count: 1, 
    itemId: "1122334", 
    country: { 
    code: { 
     preferred: "USA" 
    }, 
    name: { 
     preferred: "America" 
    } 
    }, 
    states: "50", 
    self: { 
    otherInfo: [ 

    ], 
    preferred: "National Parks" 
    }, 
    Rating: 4 
} 

org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[19]各エントリの形式でJSONです:私はRDD[String]を持っています

すべてのノードで結果のマップをブロードキャストするのは効率的ですか?私は、このマップをさらに計算によって共有/参照する必要があります。

+0

を、それはマップのサイズに依存効率的ですかどうか。本当にそれをリスト(またはHashMap)にしたいのであれば、RDDがあまりにも大きすぎると動作しないドライバに '.collect()' RDDを渡す必要があります運転手の記憶その場合、マッピングを保持するために 'RDD [(String、String)]'を使用し、 '.join()'を使ってアイテムIDを優先値に変換する必要があります。 –

答えて

0

あなたは試すことができます:

val filteredMappingsList = countryMapping.filter(x=> { 
    val jsonObj = new JSONObject(x) 
    jsonObj.has("itemId") 

}) 

val finalMapping = filteredMappingsList.map(x=>{ 
    val jsonObj = new JSONObject(x); 
    val itemId = jsonObj.get("itemId").toString() 
    val preferred = jsonObj.getJSONObject("self").get("preferred").toString() 
    (itemId, preferred) 
}).collectAsMap 

を放送する:

val broadcastedAsins = sc.broadcast(finalMapping) 
関連する問題