web-dev-qa-db-ja.com

どの操作がRDDの順序を保持しますか?

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を読み取らない)。

47
sds

明示的に保持しない操作を除き、すべての操作で順序が保持されます。順序は、sortByの直後ではなく、常に「意味のある」ものです。たとえば、ファイル(sc.textFile)を読み取ると、RDDの行はファイル内の順序になります。

完全なリストを提供しようとせずに、mapfilterflatMap、およびcoalesceshuffle=falseを使用)は順序を保持します。 sortBypartitionByjoinは順序を保持しません。

その理由は、ほとんどのRDD操作がパーティション内のIteratorsで機能するためです。したがって、mapまたはfilterには順序を台無しにする方法がありません。 code を見て、自分で確認できます。

あなたは今尋ねるかもしれません:もしHashPartitionerを持つRDDがあるならどうでしょう。 mapを使用してキーを変更するとどうなりますか?さて、それらは所定の位置にとどまり、RDDはキーで分割されません。 partitionByを使用して、シャッフルでパーティションを復元できます。

53
Daniel Darabos