2016-06-22 9 views
18

प्रश्न शीर्षक में काफी सुंदर है। मुझे मतभेदों के बारे में कोई विस्तृत दस्तावेज नहीं मिल रहा है।घन, रोलअप और समूह के बीच अंतर क्या है ऑपरेटरों?

मुझे कोई फर्क पड़ता है क्योंकि घन और समूह में इंटरचेंज करते समय फ़ंक्शन कॉल करते हैं, मुझे अलग-अलग परिणाम मिलते हैं। मैंने देखा कि परिणाम 'घन' का उपयोग करने के लिए, मुझे अक्सर अभिव्यक्तियों पर बहुत सारे शून्य मान मिलते हैं।

उत्तर

38

ये एक ही तरीके से काम करने का इरादा नहीं है। groupBy मानक एसक्यूएल में GROUP BY खंड के बराबर है।

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

cubeGROUP 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 दोनों में पेश किया।

संबंधित मुद्दे