ये एक ही तरीके से काम करने का इरादा नहीं है। groupBy
मानक एसक्यूएल में GROUP BY
खंड के बराबर है।
SELECT foo, bar, [agg-expressions] FROM table GROUP BY foo, bar
cube
GROUP BY
को CUBE
विस्तार के बराबर है: दूसरे शब्दों में
table.groupBy($"foo", $"bar")
के बराबर है। यह स्तंभों की एक सूची लेता है और समूह अभिव्यक्तियों के सभी संभावित संयोजन पर पर कुल अभिव्यक्ति लागू करता है।
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)
गणना: आप इस तरह डेटा है का कहना है की सुविधा देता है
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
// +----+----+-----+
cube
के लिए एक समान कार्य rollup
जो श्रेणीबद्ध उप-योगों की गणना करता है बाएं से दाएं है :
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
प्रत्येक पंक्ति का उपयोग कर केवल उसके संगत सारांश में एक बार शामिल किया गया है की तुलना के लिए सेंट सादा groupBy
का परिणाम देख सकते हैं।
GROUP BY CUBE(..)
के साथ प्रत्येक पंक्ति को दर्शाए गए स्तरों के प्रत्येक संयोजन के सारांश में शामिल किया गया है, वाइल्डकार्ड शामिल हैं। तार्किक रूप से, ऊपर दिखाए गए कुछ इस तरह के बराबर (यह मानते हुए हम NULL
प्लेसहोल्डर इस्तेमाल कर सकते हैं) है:
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
GROUP BY ROLLUP(...)
साथ 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
ROLLUP
और CUBE
डेटा भंडारण एक्सटेंशन से आते हैं, इसलिए यदि आप एक बेहतर समझ यह कैसे काम करता आप भी अपने पसंदीदा RDMBS के प्रलेखन जाँच कर सकते हैं करना चाहते हैं। उदाहरण के लिए PostgreSQL ने 9.5 और these are relatively well documented दोनों में पेश किया।