2016-05-18 7 views
0

これは本当に素朴な質問のようですが、私はどこでもまっすぐな答えを見つけることができません。RDDで複数のパスを最適化できますか?

私は、非常に大きなTSVファイルを分散キーストアにロードする2組のキー/値ペアに変換するためにSpark RDDを使用しています。私は、TSVが非常に明確なスキーマに従わず、スパース行列がより良いモデルであるため、DataFramesを使用していません。

Entity-Attribute-Valueモデルでは、1組のキーと値のペアが元のデータを表し、もう1組はキーと値を最初のセットからアトリビュート値エンティティモデル(?)に転記します。期限まで。 mapPartitions原因スパークへの個別の呼び出しは二回全体RDDを反復します:

私の擬似コードは

val orig: RDD[String] = sc.textFile("hdfs:///some-file.tsv").cache 
val entityAttrPairs = orig.mapPartitions(convertLinesToKVPairs) 
val attrEntityPairs = orig.mapPartitions(convertLinesToIndexKVPairs) 
entityAttrPairs.saveAsNewAPIHadoopFile("hdfs:///ready-for-ingest/entity-attr") 
attrEntityPairs.saveAsNewAPIHadoopFile("hdfs:///ready-for-ingest/attr-entity") 

私の質問は、おおよそのですか?エンティティattrとattrエンティティのペアをRDD経由で一度に生成する方がコードをはるかに読みにくくしても、より良いでしょうか?

答えて

3

はい、いいえ。基本RDDはキャッシュされているので、最初のマップはそれをロードしてメモリに格納します。 2番目のマップは、元のRDDの別の分岐であるため、新しい反復を必要とします。ただし、今回は元のRDDがキャッシュから読み込まれます。

+0

ありがとうございます。私はあなたが何を意味するかを見ます。 "ブランチ"。私が代わりに行った場合、val entityAttrPairs = orig.mapPartitions(...); val attrEntityPairs = entityAttrPairs.mapPartitions(...)、つまり。ブランチの代わりにチェーンを使用すると、SparkはRDDの通過回数を最適化できますか? –

+0

はい、それは一緒に2つを構成します。 –

関連する問題