日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hive分析窗口函数(五) GROUPING SETS,GROUPING__ID,CUBE,ROLLUP

發布時間:2023/12/10 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hive分析窗口函数(五) GROUPING SETS,GROUPING__ID,CUBE,ROLLUP 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

GROUPING SETS

該關鍵字可以實現同一數據集的多重group by操作。事實上GROUPING SETS是多個GROUP BY進行UNION ALL操作的簡單表達,它僅僅使用一個stage完成這些操作。GROUPING SETS的子句中如果包含()數據集,則表示整體聚合。

Aggregate Query with GROUPING SETS

Equivalent Aggregate Query with GROUP BY

SELECT a, b, SUM( c ) FROM tab1 GROUP BY a, b GROUPING SETS ( (a, b), a, b, ( ) )

SELECT a, b, SUM( c ) FROM tab1 GROUP BY a, b

UNION

SELECT a, null, SUM( c ) FROM tab1 GROUP BY a, null

UNION

SELECT null, b, SUM( c ) FROM tab1 GROUP BY null, b

UNION

SELECT null, null, SUM( c ) FROM tab1

SELECT a, b, SUM( c ) FROM tab1 GROUP BY a, b GROUPING SETS ( (a,b), a)

SELECT a, b, SUM( c ) FROM tab1 GROUP BY a, b

UNION

SELECT a, null, SUM( c ) FROM tab1 GROUP BY a

SELECT a, b, SUM(c) FROM tab1 GROUP BY a, b GROUPING SETS ( (a,b) )

SELECT a, b, SUM(c) FROM tab1 GROUP BY a, b

SELECT a,b, SUM( c ) FROM tab1 GROUP BY a, b GROUPING SETS (a,b)

SELECT a, null, SUM( c ) FROM tab1 GROUP BY a

UNION

SELECT null, b, SUM( c ) FROM tab1 GROUP BY b

ROLLUP

擴展了GROUTING SETS。

其中count(d) 可以換成其他聚合函數例如:sum(d)

select a, b, c, count(d) from table group by a, b, c WITH ROLLUP; // 等價于下面語句 select a, b, c from table group by a, b, c GROUPING SETS((a,b,c),(a,b),(a),());

CUBE

擴展了GROUTING SETS,對各種條件進行聚合。

其中count(d) 可以換成其他聚合函數例如:sum(d)

select a, b, c,count(d) from table group by a, b, c WITH ROLLUP; // 等價于下面語句 select a, b, c from table group by a, b, c GROUPING SETS((a,b,c),(a,b),(a,c),(b,c),(a),(b),(c),());

聚合條件 HAVING

having用于在組內進行過濾。

select cid,max(price) mx from orders group by cid having mx > 1000; //等價于下面的子查詢語句 select t.cid, t.mx from (select cid, max(price) mx from orders group by cid) t where t.mx > 1000;

Cubes and Rollups

The general syntax is WITH CUBE/ROLLUP. It is used with the GROUP BY only. CUBE creates a subtotal of all possible combinations of the set of column in its argument. Once we compute a CUBE on a set of dimension, we can get answer to all possible aggregation questions on those dimensions.It might be also worth mentioning here that? GROUP BY a, b, c WITH CUBE is equivalent to? GROUP BY a, b, c GROUPING SETS ( (a, b, c), (a, b), (b, c), (a, c), (a), (b), (c), ( )).ROLLUP clause is used with GROUP BY to compute the aggregate at the hierarchy levels of a dimension. GROUP BY a, b, c with ROLLUP assumes that the hierarchy is "a" drilling down to "b" drilling down to "c".GROUP BY a, b, c, WITH ROLLUP is equivalent to GROUP BY a, b, c GROUPING SETS ( (a, b, c), (a, b), (a), ( )).

實例:

轉載地址:

??Hive分析窗口函數(五) GROUPING SETS,GROUPING__ID,CUBE,ROLLUP

GROUPING SETS,GROUPING__ID,CUBE,ROLLUP

這幾個分析函數通常用于OLAP中,不能累加,而且需要根據不同維度上鉆和下鉆的指標統計,比如,分小時、天、月的UV數。

Hive版本為 apache-hive-0.13.1

數據準備:

2015-03,2015-03-10,cookie12015-03,2015-03-10,cookie52015-03,2015-03-12,cookie72015-04,2015-04-12,cookie32015-04,2015-04-13,cookie22015-04,2015-04-13,cookie42015-04,2015-04-16,cookie42015-03,2015-03-10,cookie22015-03,2015-03-10,cookie32015-04,2015-04-12,cookie52015-04,2015-04-13,cookie62015-04,2015-04-15,cookie32015-04,2015-04-15,cookie22015-04,2015-04-16,cookie1CREATE EXTERNAL TABLE lxw1234 (month STRING,day STRING, cookieid STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' stored as textfile location '/tmp/lxw11/';hive> select * from lxw1234;OK2015-03 2015-03-10 cookie12015-03 2015-03-10 cookie52015-03 2015-03-12 cookie72015-04 2015-04-12 cookie32015-04 2015-04-13 cookie22015-04 2015-04-13 cookie42015-04 2015-04-16 cookie42015-03 2015-03-10 cookie22015-03 2015-03-10 cookie32015-04 2015-04-12 cookie52015-04 2015-04-13 cookie62015-04 2015-04-15 cookie32015-04 2015-04-15 cookie22015-04 2015-04-16 cookie1

GROUPING SETS

?

在一個GROUP BY查詢中,根據不同的維度組合進行聚合,等價于將不同維度的GROUP BY結果集進行UNION ALL

SELECT month,day,COUNT(DISTINCT cookieid) AS uv,GROUPING__ID FROM lxw1234 GROUP BY month,day GROUPING SETS (month,day) ORDER BY GROUPING__ID;month day uv GROUPING__ID------------------------------------------------2015-03 NULL 5 12015-04 NULL 6 1NULL 2015-03-10 4 2NULL 2015-03-12 1 2NULL 2015-04-12 2 2NULL 2015-04-13 3 2NULL 2015-04-15 2 2NULL 2015-04-16 2 2等價于 SELECT month,NULL,COUNT(DISTINCT cookieid) AS uv,1 AS GROUPING__ID FROM lxw1234 GROUP BY month UNION ALL SELECT NULL,day,COUNT(DISTINCT cookieid) AS uv,2 AS GROUPING__ID FROM lxw1234 GROUP BY day

再如:

SELECT month,day,COUNT(DISTINCT cookieid) AS uv,GROUPING__ID FROM lxw1234 GROUP BY month,day GROUPING SETS (month,day,(month,day)) ORDER BY GROUPING__ID;month day uv GROUPING__ID------------------------------------------------2015-03 NULL 5 12015-04 NULL 6 1NULL 2015-03-10 4 2NULL 2015-03-12 1 2NULL 2015-04-12 2 2NULL 2015-04-13 3 2NULL 2015-04-15 2 2NULL 2015-04-16 2 22015-03 2015-03-10 4 32015-03 2015-03-12 1 32015-04 2015-04-12 2 32015-04 2015-04-13 3 32015-04 2015-04-15 2 32015-04 2015-04-16 2 3等價于SELECT month,NULL,COUNT(DISTINCT cookieid) AS uv,1 AS GROUPING__ID FROM lxw1234 GROUP BY month UNION ALL SELECT NULL,day,COUNT(DISTINCT cookieid) AS uv,2 AS GROUPING__ID FROM lxw1234 GROUP BY dayUNION ALL SELECT month,day,COUNT(DISTINCT cookieid) AS uv,3 AS GROUPING__ID FROM lxw1234 GROUP BY month,day

其中的?GROUPING__ID,表示結果屬于哪一個分組集合。

CUBE

根據GROUP BY的維度的所有組合進行聚合。

SELECT month,day,COUNT(DISTINCT cookieid) AS uv,GROUPING__ID FROM lxw1234 GROUP BY month,day WITH CUBE ORDER BY GROUPING__ID;month day uv GROUPING__ID--------------------------------------------NULL NULL 7 02015-03 NULL 5 12015-04 NULL 6 1NULL 2015-04-12 2 2NULL 2015-04-13 3 2NULL 2015-04-15 2 2NULL 2015-04-16 2 2NULL 2015-03-10 4 2NULL 2015-03-12 1 22015-03 2015-03-10 4 32015-03 2015-03-12 1 32015-04 2015-04-16 2 32015-04 2015-04-12 2 32015-04 2015-04-13 3 32015-04 2015-04-15 2 3等價于SELECT NULL,NULL,COUNT(DISTINCT cookieid) AS uv,0 AS GROUPING__ID FROM lxw1234UNION ALL SELECT month,NULL,COUNT(DISTINCT cookieid) AS uv,1 AS GROUPING__ID FROM lxw1234 GROUP BY month UNION ALL SELECT NULL,day,COUNT(DISTINCT cookieid) AS uv,2 AS GROUPING__ID FROM lxw1234 GROUP BY dayUNION ALL SELECT month,day,COUNT(DISTINCT cookieid) AS uv,3 AS GROUPING__ID FROM lxw1234 GROUP BY month,day

?

ROLLUP

是CUBE的子集,以最左側的維度為主,從該維度進行層級聚合。

比如,以month維度進行層級聚合:SELECT month,day,COUNT(DISTINCT cookieid) AS uv,GROUPING__ID FROM lxw1234 GROUP BY month,dayWITH ROLLUP ORDER BY GROUPING__ID;month day uv GROUPING__ID---------------------------------------------------NULL NULL 7 02015-03 NULL 5 12015-04 NULL 6 12015-03 2015-03-10 4 32015-03 2015-03-12 1 32015-04 2015-04-12 2 32015-04 2015-04-13 3 32015-04 2015-04-15 2 32015-04 2015-04-16 2 3可以實現這樣的上鉆過程:月天的UV->月的UV->總UV --把month和day調換順序,則以day維度進行層級聚合:SELECT day,month,COUNT(DISTINCT cookieid) AS uv,GROUPING__ID FROM lxw1234 GROUP BY day,month WITH ROLLUP ORDER BY GROUPING__ID;day month uv GROUPING__ID-------------------------------------------------------NULL NULL 7 02015-04-13 NULL 3 12015-03-12 NULL 1 12015-04-15 NULL 2 12015-03-10 NULL 4 12015-04-16 NULL 2 12015-04-12 NULL 2 12015-04-12 2015-04 2 32015-03-10 2015-03 4 32015-03-12 2015-03 1 32015-04-13 2015-04 3 32015-04-15 2015-04 2 32015-04-16 2015-04 2 3可以實現這樣的上鉆過程:天月的UV->天的UV->總UV(這里,根據天和月進行聚合,和根據天聚合結果一樣,因為有父子關系,如果是其他維度組合的話,就會不一樣)

Grouping_ID函數

當我們沒有統計某一列時,它的值顯示為null,這可能與列本身就有null值沖突,這就需要一種方法區分是沒有統計還是值本來就是null。(寫一個排列組合的算法,就馬上理解了,grouping_id其實就是所統計各列二進制和)

直接拿官方文檔一個例子,O(∩_∩)O哈哈~

Column1 (key)Column2 (value)
1NULL
11
22
33
3NULL
45

hql統計:

SELECT key, value, GROUPING__ID, count(*) from T1 GROUP BY key, value WITH ROLLUP

統計結果如下:

????
NULLNULL0 ? ? 006
1NULL1 ? ? 102
1NULL3 ? ? 111
113 ? ? 111
2NULL1 ? ? 101
223 ? ? 111
3NULL1 ? ? 102
3NULL3 ? ? 111
333 ? ? 111
4NULL1 ? ? 101
453 ? ? 111

GROUPING__ID轉變為二進制,如果對應位上有值為null,說明這列本身值就是null。(通過類DataFilterNull.py?掃描,可以篩選過濾掉列中null、“”統計結果),

總結

cube的分組組合最全,是各個維度值的笛卡爾(包含null)組合,

rollup的各維度組合應滿足,前一維度為null后一位維度必須為null,前一維度取非null時,下一維度隨意,

grouping sets則為自定義維度,根據需要分組即可。

ps:通過grouping sets的使用可以簡化SQL,比group by單維度進行union性能更好。

這種函數,需要結合實際場景和數據去使用和研究,只看說明的話,很難理解。

?

官網的介紹: https://cwiki.apache.org/confluence/display/Hive/Enhanced+Aggregation%2C+Cube%2C+Grouping+and+Rollup

轉發:https://www.2cto.com/database/201708/671294.html

轉發:https://blog.csdn.net/zhoudetiankong/article/details/52527142

參考:https://blog.csdn.net/suiyingli39/article/details/53540861

參考:https://blog.csdn.net/moon_yang_bj/article/details/17200367

依據上面兩篇博客以及官網,整理

總結

以上是生活随笔為你收集整理的Hive分析窗口函数(五) GROUPING SETS,GROUPING__ID,CUBE,ROLLUP的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 少妇xxx | 精品国产视频一区二区 | 强伦轩人妻一区二区电影 | 在线免费观看毛片 | 91在线视频精品 | 午夜爱爱毛片xxxx视频免费看 | 天堂中文字幕av | 色999视频 | 中文字幕有码无码人妻av蜜桃 | 欧美视频在线观看一区二区三区 | 亚洲一级Av无码毛片久久精品 | 伊人影院亚洲 | 杨幂一区二区国产精品 | 欧美在线影院 | 欧美日韩成人一区 | 尤物在线精品 | 美女久久久久 | 国产欧美在线视频 | 国产精品无码免费专区午夜 | 国产一区二区免费看 | 日本一区二区三区网站 | 久久视频国产 | 日韩一卡二卡三卡 | 丰满人妻熟妇乱偷人无码 | 日日日日干 | 91亚洲欧美激情 | 激情网av | 亚洲啪啪av | 色桃网| 在线视频h | 四虎1515hh.com| 神马午夜精品 | 国产精品久久久久久久久久久久久久久久 | 天天做夜夜做 | 久久久久久久久久久免费 | 99综合久久 | 中文字幕第一页av | 麻豆专区 | 青青草华人在线 | 成年人在线免费观看视频网站 | 好姑娘在线观看高清完整版电影 | 国产91精品露脸国语对白 | 中国女人内精69xxxxxx | 欧美sm视频 | 亚洲精品资源在线 | 熟女肥臀白浆大屁股一区二区 | 九九视频在线免费观看 | 国产福利一区在线观看 | 日韩免费视频一区 | 一区二区成人免费视频 | 丰满人妻一区二区三区大胸 | 精品伦一区二区三区 | 国产乱淫a∨片免费视频 | 国产精品后入内射日本在线观看 | 欧美高清大白屁股ass18 | 精品视频免费观看 | 香蕉视频久久 | 日韩午夜激情电影 | 第色| 欧美日韩在线播放 | 久久精品黄色 | 亚洲成年人av | c逼视频| 老司机av导航 | 黄色av免费观看 | а√在线中文网新版地址在线 | 精品www久久久久久奶水 | 青草久久久 | 日韩精品第三页 | 欧美综合亚洲图片综合区 | 国产在线观看无码免费视频 | 丁香八月婷婷 | 国产片在线播放 | 欧美日韩黄色一级片 | 人成在线免费视频 | 国产91一区二区三区在线精品 | 韩国三级在线视频 | 人人澡超碰碰97碰碰碰 | 亚洲天堂岛 | 女厕厕露p撒尿八个少妇 | 最近的中文字幕 | 精品无码一区二区三区的天堂 | 欧美日韩在线视频播放 | 印度午夜性春猛xxx交 | 九九九九九伊人 | 亚洲熟女少妇一区 | 国产精品视频免费观看 | 老熟女毛茸茸浓毛 | 我和我的太阳泰剧在线观看泰剧 | 日朝毛片| 91免费视| 尤物视频免费在线观看 | 在线免费一区二区 | 久草免费在线视频 | 日韩精品资源 | 成年人免费网站在线观看 | jvid在线 | 日本a区| 青青青青青青青青草 |