2016-08-26 6 views

答えて

1

短い答え:いいえ、Apache Sparkが提供する並べ替え機能を使用しているときに2つの入力RDDが既にソートされているという事実を利用する方法はありません。

長い答え:特定の条件下では、sortByまたはsortByKeyを使用するよりも良い方法がある可能性があります。

最も明白なケースは、入力RDDが既にソートされており、異なる範囲を表している場合です。この場合、rdd1のすべての要素が(選択された順序に従って)rdd2のすべての要素の前に来ると仮定して、入力RDDを結合するための最も速い(実質的にゼロのコストの)方法は、rdd1.union(rdd2)を使用することです。

入力RDDの範囲が重複すると、状況がより複雑になります。ターゲットRDDが単一のパーティションしか持たないと仮定した場合、両方のRDDでtoLocalIteratorを使用して手動でマージすると効率的です。結果がRDDでなければならない場合は、カスタムRDDタイプのcomputeメソッド内でこれを行い、入力RDDを処理して出力を生成することができます。

入力が大きく、多くのパーティションで構成されていると、処理がさらに複雑になります。この場合、出力RDDにも複数のパーティションが必要になることがあります。前述のカスタムRDDを使用できますが、複数のパーティションを作成することもできます(RangePartitionerを使用)。各パーティションは異なる要素の範囲をカバーする(最適な場合、これらの範囲は出力のほぼ同じ大きさの部分をカバーする)。

このような難しい部分は、computeの中に完全な入力RDDを複数回処理することを避けることです。これは、入力RDDがRangePartitionerを使用しているときfilterByRangeOrderedRDDFunctionsから効率的に回避することができます。彼らがRangePartitionerを使用していないにもかかわらず、パーティションが内部的に注文され、グローバルオーダを持っていることがわかっている場合は、実際にデータを調査して、これらのパーティションがカバーする有効範囲を調べる必要があります。

複数のパーティションのケースがかなり複雑なので、カスタムメイドソートが実際にsortByまたはsortByKeyを使用するよりも実際に高速かどうかを確認します。 sortBysortByKeyのロジックは、シャッフル処理(ノード間でのデータ転送)に関して高度に最適化されています。この理由から、カスタムメイドロジックがO(n)であっても、sortBy/sortByKeyがO(n log(n))であっても、多くの場合、これらのメソッドはカスタムメイドロジックより高速です。最高でも。

Apache Sparkで使用されるシャッフルロジックの詳細については、articleの基本概念を説明しています。

関連する問題