Hive Sql 查詢最被喜歡的愛好的前三名

2021-10-24 01:40:54 字數 1747 閱讀 3296

需求:查詢最被喜歡的愛好的前三名。

(需求解析:最被喜歡的愛好,就是看哪個愛好的人數最多)

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

看電影打桌球

游泳看書

購物

喜歡和愛的區別

喜歡你的人 半夜會找你打 聊天到很晚。愛你的人 半夜看你在網上會趕你下線。喜歡你的人 他會找你出去玩,叫你放棄正事或逃課。愛你的人 他會催你快寫作業或者與你討 課。喜歡你的人 在你生病時,會講好話關心你。愛你的人 在你生病時,他會關心到你煩,並強迫你去看醫生。喜歡你的人 他會盡量說好話來討好你,你也...

愛和喜歡的區別

愛是在寂寞的夜裡,思念如潮水般湧來,手裡捧著書卻怎麼也看不進去,心裡惦記著他此時是否還在加班,吃沒吃晚飯,是不是如自己想著他一般想著自己 喜歡是和他討論問題爭的面紅耳赤,各不相讓,在他面前像個刺蝟一樣從不認輸,但在心裡卻早已暗暗佩服他的見地他的才華。愛是希望他和自己步調一致,和自己心靈相通,他無心說...

愛和喜歡的區別

愛是他在的時候,眼睛裡只有他一人 他不在的時候,一切都帶有他的影子。喜歡是在深夜看書時突然想起他,想象他現在做什麼,心裡漾起一陣輕飄飄的溫暖,卻從不主動給他打 幾分鐘後,注意力又重新被書中的情節吸引 愛是在寂寞的夜裡,思念如潮水般湧來,手裡捧著書卻怎麼也看不進去,心裡惦記著他此時是否還在加班,吃沒吃...