遅延評価のために実行する必要がないと思われる場合でも、どうすればSparkにmapの呼び出しを実行させることができますか?
Map呼び出しでcache()
を配置しようとしましたが、それでもトリックは実行されません。私のマップメソッドは、実際に結果をHDFSにアップロードします。だから、役に立たないわけではありませんが、Sparkはそう考えています。
短い答え:
強制的にSpark=変換を実行するには、結果を要求する必要があります。場合によっては、単純なcount
アクションで十分です。
TL; DR:
OK、RDD
操作を確認しましょう。
RDD
sは、2種類の操作をサポートします。
たとえば、map
は、各データセット要素を関数に渡し、結果を表す新しいRDDを返す変換です。一方、reduce
は、何らかの関数を使用してRDDのすべての要素を集約し、ドライバープログラムに最終結果を返すアクションです(ただし、分散データセットを返すreduceByKey
もあります) )。
Spark)のすべての変換はlazyであり、は結果を正しく計算しない離れています。
代わりに、一部のベースデータセット(ファイルなど)に適用された変換を覚えているだけです。 変換は、アクションが結果をドライバープログラムに返す必要がある場合にのみ計算されます。この設計により、Spark=をより効率的に実行できます。たとえば、mapで作成されたデータセットがreduceで使用され、reduceの結果のみをドライバーに返すことがわかります。より大きなマップされたデータセット。
デフォルトでは、変換された各RDD
は、アクションを実行するたびに再計算されます。ただし、RDD
(またはpersist
)メソッドを使用してcache
をメモリに保持することもできます。この場合、Sparkは要素を保持しますクラスターを使用すると、次にクエリを実行するときに、より高速にアクセスできます。ディスク上のRDD
sの永続化や、複数のノード間での複製もサポートされています。
Spark= mapへの呼び出しを実行するように強制するには、結果を要求する必要があります。場合によってはcount
アクションで十分です。
Spark transformations 行うべきことのみを記述します。実行をトリガーするには、 action が必要です。
あなたの場合、より深い問題があります。 HDFSにデータを保存するなど、何らかの副作用を引き起こすことが目標である場合、使用する正しい方法はforeach
です。これはアクションであり、明確なセマンティクスを備えています。 map
と異なり、重要なことは、参照の透明性を意味するものではありません。