2016-06-22 9 views
18

質問にはかなりの質問があります。私はその違いに関する詳細な文書を見つけることができません。キューブ、ロールアップ、およびgroupBy演算子の違いは何ですか?

cubeとgroupByの関数呼び出しを交換すると、結果が異なるため、私は違いがあることに気付きます。私は、「キューブ」を使用した結果に対して、私が頻繁にグループ化した式にヌル値がたくさんあることに気付きました。

答えて

38

これらは同じように動作することを意図しない。 groupByは、標準SQLのGROUP BY句と同等です。言い換えれば

table.groupBy($"foo", $"bar") 

は同等です:

SELECT foo, bar, [agg-expressions] FROM table GROUP BY foo, bar 

cubeGROUP BYからCUBE拡張に相当します。列のリストを取り、グループ化列の可能なすべての組み合わせにの集約式を適用します。

val df = Seq(("foo", 1L), ("foo", 2L), ("bar", 2L), ("bar", 2L)).toDF("x", "y") 
df.show 

// +---+---+ 
// | x| y| 
// +---+---+ 
// |foo| 1| 
// |foo| 2| 
// |bar| 2| 
// |bar| 2| 
// +---+---+ 

、あなたが集合体としてのカウントでcube(x, y)を計算:あなたはこのようなデータを持っていると言うことができます

cubeと同様の機能は、左から右へ、階層小計を計算rollupある
df.cube($"x", $"y").count.show 

// +----+----+-----+  
// | x| y|count| 
// +----+----+-----+ 
// |null| 1| 1| <- count of records where y = 1 
// |null| 2| 3| <- count of records where y = 2 
// | foo|null| 2| <- count of records where x = foo 
// | bar| 2| 2| <- count of records where x = bar AND y = 2 
// | foo| 1| 1| <- count of records where x = foo AND y = 1 
// | foo| 2| 1| <- count of records where x = foo AND y = 2 
// |null|null| 4| <- total count of records 
// | bar|null| 2| <- count of records where x = bar 
// +----+----+-----+ 

df.rollup($"x", $"y").count.show 
// +----+----+-----+ 
// | x| y|count| 
// +----+----+-----+ 
// | foo|null| 2| <- count where x is fixed to foo 
// | bar| 2| 2| <- count where x is fixed to bar and y is fixed to 2 
// | foo| 1| 1| ... 
// | foo| 2| 1| ... 
// |null|null| 4| <- count where no column is fixed 
// | bar|null| 2| <- count where x is fixed to bar 
// +----+----+-----+ 

ジュ

df.groupBy($"x", $"y").count.show 

// +---+---+-----+ 
// | x| y|count| 
// +---+---+-----+ 
// |foo| 1| 1| <- this is identical to x = foo AND y = 1 in CUBE or ROLLUP 
// |foo| 2| 1| <- this is identical to x = foo AND y = 2 in CUBE or ROLLUP 
// |bar| 2| 2| <- this is identical to x = bar AND y = 2 in CUBE or ROLLUP 
// +---+---+-----+ 

を要約すると::

  • 平野GROUP BYすべての行を使用して、一度だけ、それに対応する要約に含まれている比較のためのSTはプレーンgroupByの結果を見ることができます。
  • GROUP BY CUBE(..)とは、それが表すレベルの組み合わせごとにすべての行が含まれ、ワイルドカードが含まれています。論理的には、上に示した(私たちはNULLプレースホルダを使用したと仮定すると)、このようなものに相当します。GROUP BY ROLLUP(...)

    SELECT NULL, NULL, COUNT(*) FROM table 
    UNION ALL 
    SELECT x, NULL, COUNT(*) FROM table GROUP BY x 
    UNION ALL 
    SELECT NULL, y, COUNT(*) FROM table GROUP BY y 
    UNION ALL 
    SELECT x, y, COUNT(*) FROM table GROUP BY x, y 
    
  • CUBEに似ていますが、左から右にcolumsを充填することにより、階層的に動作します。

    SELECT NULL, NULL, COUNT(*) FROM table 
    UNION ALL 
    SELECT x, NULL, COUNT(*) FROM table GROUP BY x 
    UNION ALL 
    SELECT x, y, COUNT(*) FROM table GROUP BY x, y 
    

ROLLUPCUBEあなたは、これはまた、あなたの好きなRDMBSのマニュアルを確認することができますどのように機能するかをより良く理解を取得したいので、もし、データ・ウェアハウスの拡張機能から来ます。例えば、PostgreSQLは9.5とthese are relatively well documentedの両方に導入されています。

関連する問題