需求:查詢最被喜歡的愛好的前三名。
(需求解析:最被喜歡的愛好,就是看哪個愛好的人數最多)
user_hobbys表,資料如下、資料是製表符隔開的:
name *** hobby
john 男 打桌球,游泳,看電影
jack 男 打桌球,看電影
lucy 女 看書,購物
lili 女 游泳,看電影
create table if not exists user_hobbys(
name string,
*** string,
hobby array
)row format delimited
fields terminated by 『\t』
collection items terminated by 『,』
;load data local inpath 『/root/data/user_hobbys.txt』 overwrite into table user_hobbys;
第一步:
select hobb,count(*) num from user_hobbys lateral view explode(hobby) t as hobb group by hobb order by num desc;
explode() :展開函式,udtf函式中的一種,作用是接受乙個資料行(這裡是一行陣列,陣列名字放在括號裡),
然後返回產生多個資料行
lateral view : 虛擬表,會將udtf函式生成的結果放在乙個虛擬表中,然後這個虛擬表會和輸入行進行join
來達到資料聚合的目的。
一般這兩者一起使用 ,放在from 表名 的後面,即 lateral view explode(hobby) ,產生的虛擬表也可以
取別名(這裡是t),這個表有乙個列,用as再取別名(這裡是 hobb)
hobb num
看電影 3
游泳 2
打桌球 2
購物 1
看書 1
第二步:
用排名函式dense_rank() 配合開窗函式新產生乙個列(這裡取列名為 rk),來記錄名次(存在並列排名)
select a.hobb,a.num,dense_rank() over(order by a.num desc) rk
from(
select hobb,count(*) num from user_hobbys lateral view explode(hobby) t as hobb group by hobb order by num desc
) a;
a.hobb a.num rk
看電影 3 1
游泳 2 2
打桌球 2 2
購物 1 3
看書 1 3
第三步:
按照需求寫where 子句過濾即可,前三名就是rk<4;
select b.hobb from
(select a.hobb,a.num,dense_rank() over(order by a.num desc) rk
from(
select hobb,count(*) num from user_hobbys lateral view explode(hobby) t as hobb group by hobb order by num desc
) a ) b where b.rk<4;
b.hobb
看電影打桌球
游泳看書
購物
喜歡和愛的區別
喜歡你的人 半夜會找你打 聊天到很晚。愛你的人 半夜看你在網上會趕你下線。喜歡你的人 他會找你出去玩,叫你放棄正事或逃課。愛你的人 他會催你快寫作業或者與你討 課。喜歡你的人 在你生病時,會講好話關心你。愛你的人 在你生病時,他會關心到你煩,並強迫你去看醫生。喜歡你的人 他會盡量說好話來討好你,你也...
愛和喜歡的區別
愛是在寂寞的夜裡,思念如潮水般湧來,手裡捧著書卻怎麼也看不進去,心裡惦記著他此時是否還在加班,吃沒吃晚飯,是不是如自己想著他一般想著自己 喜歡是和他討論問題爭的面紅耳赤,各不相讓,在他面前像個刺蝟一樣從不認輸,但在心裡卻早已暗暗佩服他的見地他的才華。愛是希望他和自己步調一致,和自己心靈相通,他無心說...
愛和喜歡的區別
愛是他在的時候,眼睛裡只有他一人 他不在的時候,一切都帶有他的影子。喜歡是在深夜看書時突然想起他,想象他現在做什麼,心裡漾起一陣輕飄飄的溫暖,卻從不主動給他打 幾分鐘後,注意力又重新被書中的情節吸引 愛是在寂寞的夜裡,思念如潮水般湧來,手裡捧著書卻怎麼也看不進去,心裡惦記著他此時是否還在加班,吃沒吃...