2017-11-08 16 views
5

私は約21億レコードのデータセットを持っていると言います。pyspark Window.partitionBy vs groupBy

これは顧客情報を持つデータセットであり、何回何回何回行ったのか知りたいと思っています。だから私はIDをグループ化し、1つの列を合計する必要があります(1はアクションを示す0と1の値を持ちます)。

今、私は単純なgroupByagg(sum)を使用することができますが、これは私の理解には本当に効率的ではありません。 groupByは、パーティション間で大量のデータを移動します。

また、partitionBy句のWindow関数を使用してデータを合計することもできます。欠点の1つは、すべてのデータを保持するために余分なフィルタを適用する必要があることです。 IDごとに1つのレコードが必要です。

しかし、私はこのウィンドウがどのようにデータを処理するか分かりません。それはこのグループよりも優れていますか?それとも同じですか?

答えて

3

私が知る限り、spark DataFramesで作業する場合、の操作はCatalystで最適化されています。 DataFramesのgroupByは、RDDのgroupByと異なります。

たとえば、DataFramesのgroupByは、最初にパーティションで集計を実行した後、最終集計ステージで集計結果をシャッフルします。したがって、データ全体ではなく、集計された結果だけがシャッフルされます。これはRDDのreduceByKeyまたはaggregateByKeyに似ています。この関連のあるSO-articleを参考にしてください。

さらに、このpresentationのスライド5(Yin Huai著、DataFramesとCatalystの併用に関するメリットを参照)を参照してください。

最後に、spark DataFramesを使用している場合は、groupByを使用しても問題ないと思います。 Windowを使用することはあなたの要求に対して私にとっては適切ではないようです。