RDDは、 sortBy()
で処理された場合、意味のある(ストレージモデルによって課されるランダムな順序とは対照的に)順序を持ちます。これで説明されているように reply 。
さて、どの操作preserveの順序ですか?
たとえば、guaranteedthat(a.sortBy()
の後)
a.map(f).Zip(a) ===
a.map(x => (f(x),x))
どう?
a.filter(f).map(g) ===
a.map(x => (x,g(x))).filter(f(_._1)).map(_._2)
どう?
a.filter(f).flatMap(g) ===
a.flatMap(x => g(x).map((x,_))).filter(f(_._1)).map(_._2)
ここで「平等」===
は「機能的同等性」として理解されます。つまり、ユーザーレベルの操作を使用して結果を区別する方法はありません(つまり、ログ&cを読み取らない)。
明示的に保持しない操作を除き、すべての操作で順序が保持されます。順序は、sortBy
の直後ではなく、常に「意味のある」ものです。たとえば、ファイル(sc.textFile
)を読み取ると、RDDの行はファイル内の順序になります。
完全なリストを提供しようとせずに、map
、filter
、flatMap
、およびcoalesce
(shuffle=false
を使用)は順序を保持します。 sortBy
、partitionBy
、join
は順序を保持しません。
その理由は、ほとんどのRDD操作がパーティション内のIterator
sで機能するためです。したがって、map
またはfilter
には順序を台無しにする方法がありません。 code を見て、自分で確認できます。
あなたは今尋ねるかもしれません:もしHashPartitioner
を持つRDDがあるならどうでしょう。 map
を使用してキーを変更するとどうなりますか?さて、それらは所定の位置にとどまり、RDDはキーで分割されません。 partitionBy
を使用して、シャッフルでパーティションを復元できます。