之前參加校招面試的時候锻拘,遇到一個hive分組函數(shù)的題目轮锥,大致內(nèi)容如下:
我們有如下的一張表(數(shù)據(jù)純屬虛構(gòu)):
表中一共有四列數(shù)據(jù),分別是地區(qū)毡琉,員工姓名铁瞒,月份和銷量。目前的需求時桅滋,想同時得到各地區(qū)的銷量慧耍、各員工的銷量,以及每個員工在每個地區(qū)的銷量丐谋。
當時我是這么回答的:使用Group by和union all芍碧,對應(yīng)的代碼如下:
select
area,null as name,sum(cnt) as sum_cnt
from
default.salerinfo2
group by area
union all
select
null as area,name,sum(cnt) as sum_cnt
from
default.salerinfo2
group by name
union all
select
area,name,sum(cnt) as sum_cnt
from
default.salerinfo2
group by area,name
這樣確實可以得到對應(yīng)的結(jié)果:
但是不是覺得太繁瑣了,其實hive中還有一個更高階的分組函數(shù)号俐,可以幫我們更加簡潔的實現(xiàn)上面的功能泌豆,即Grouping Sets函數(shù),我們可以把想要用于分組的列全都聲明在Grouping Sets函數(shù)中吏饿,其代碼如下:
select
area,name,sum(cnt) as sum_cnt
from
default.salerinfo3
group by area,name
grouping sets ((area),(name),(area,name))
得到了同樣正確的結(jié)果:
可以看到踪危,使用grouping sets必須首先用group by聲明用于分組的列蔬浙,如果不使用group by聲明,報錯如下:
FAILED: ParseException line 5:0 cannot recognize input near 'grouping' 'sets' '(' in table source
同樣贞远,用于分組的列畴博,必須全都在group by中聲明,如果grouping sets使用了沒有在group by中出現(xiàn)的列蓝仲,如下面的代碼報錯如下:
select
area,name,sum(cnt) as sum_cnt
from
default.salerinfo3
group by area
grouping sets ((area),(name),(area,name))
SemanticException 6:23 [Error 10213]: Grouping sets expression is not in GROUP BY key. Error encountered near token 'name'
是不是又學習到了新知識了呢俱病,嘻嘻