これは本当に素朴な質問のようですが、私はどこでもまっすぐな答えを見つけることができません。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経由で一度に生成する方がコードをはるかに読みにくくしても、より良いでしょうか?
ありがとうございます。私はあなたが何を意味するかを見ます。 "ブランチ"。私が代わりに行った場合、val entityAttrPairs = orig.mapPartitions(...); val attrEntityPairs = entityAttrPairs.mapPartitions(...)、つまり。ブランチの代わりにチェーンを使用すると、SparkはRDDの通過回数を最適化できますか? –
はい、それは一緒に2つを構成します。 –