2015-10-20 2 views
7

rdd.collect()の代わりにRDBでcollectAsMapを使用すると、パフォーマンスに何か影響はありますか?toMap?rdd.collect()。toMapとrdd.collectAsMap()の違いは?

キー値がrddで、ドライバで実行されているので、大きなデータセットでcollect()が効率的でないことがわかっている限り、HashMapに変換したいのですが、代わりにパフォーマンスが影響しますか?

オリジナル:

val QuoteHashMap=QuoteRDD.collect().toMap 
val QuoteRDDData=QuoteHashMap.values.toSeq 
val QuoteRDDSet=sc.parallelize(QuoteRDDData.map(x => x.toString.replace("(","").replace(")",""))) 
QuoteRDDSet.saveAsTextFile(Quotepath) 

変更:理由collectAsMap

val QuoteHashMap=QuoteRDD.collectAsMap() 
val QuoteRDDData=QuoteHashMap.values.toSeq 
val QuoteRDDSet=sc.parallelize(QuoteRDDData.map(x => x.toString.replace("(","").replace(")",""))) 
QuoteRDDSet.saveAsTextFile(Quotepath) 
+1

パフォーマンスに大きな違いはありません。 'collectAsMap'は単に' RDD'を収集し、ドライバに変更可能な 'HashMap'を作成します。 – zero323

+0

ベストプラクティスを使用してハッシュマップを作成する方法はありますか? collectAsMapまたはcollect()。toMapを使用せずに? –

+0

重複したキーが必要な場合は、重複したデータを削除することで、ドライバに転送されるデータの量を減らすことができます。 – zero323

答えて

2

collectAsMapの実装は、以下の

def collectAsMap(): Map[K, V] = self.withScope { 
    val data = self.collect() 
    val map = new mutable.HashMap[K, V] 
    map.sizeHint(data.length) 
    data.foreach { pair => map.put(pair._1, pair._2) } 
    map 
    } 

である。したがって、collectcollectAsMapの間には、性能差は、ありませんコールundeフードもcollectです。

1

違いはありません。できるだけ多くの場合、collect()を使用しないでください。並列性の概念が破壊され、ドライバ上のデータが収集されるためです。

関連する問題