hive sql常用技巧

2021-09-11 12:54:31 字數 4123 閱讀 4563

介紹一些常見的資料分析場景中hive sql的一些寫法,涉及區間分析,資料按條件轉換,資料列轉行,計算連續天數,分組排序取top n等場景。

多行合併常用於做區間統計,通過定義一定的金額區級,將上億的記錄降維為不同區間內總數。概括來說就是多對映到一。 典型場景: 基於使用者交易天流水,計算每天不同金額段的金額筆數。

如使用者的天交易流水表結構如上,需要計算出交易額在0-100,100-200,200-300,大於300幾個區級的筆數,

create

view t_deal_tmp_view_1 as

select

case

when rcv_amount <= 100

then

1when rcv_amount <= 200

then

2when rcv_amount <= 300

then

3else

4end

as amount_range,

receiver

from t_transfer_info

select

amount_range,

count(receiver) as cnt

from t_deal_tmp_view_1

group

by amount_range

drop

view t_deal_tmp_view_1

複製**

為什麼不使用下面這種寫法

select

case

when rcv_amount <= 100

then

1when rcv_amount <= 200

then

2when rcv_amount <= 300

then

3else

4end

as amount_range,

count(receiver)

from t_transfer_info

group

bycase

when rcv_amount <= 100

then

1when rcv_amount <= 200

then

2when rcv_amount <= 300

then

3else

null

end複製**

這種寫法會報expressio not in group by key 的錯誤,在hive中, 使用group by時,非group by的字段必須使用聚合函式,只有group by的字段才能原值取出。

主要原因是上面在group by後面使用case when沒方法命名新字段。 因此需要使用臨時view進行處理。

在hive的表中,有些記錄可能是null,這時如果我們直接對這條記錄做運算或邏輯判斷是得不到我們期望的結果的,這裡可以將null轉換為0再做處理。 當然null轉0可以使用hive現成的函式nvl,這裡使用case when是想介紹在hive sql裡條件語句的用法。

select 

t1.uin,

t1.income + case

when t2.income is

null

then

0else t2.income end

as income,

t1.expend + case

when t2.expend is

null

then

0else t2.expend end

as expend

from

( select

uin,

income,

expend

from t_user_trans_inf_day

where statis_day=20180812

)t1left

join

( select

uin,

income,

expend

from t_user_trans_inf_day

where statis_day=20180811

)t2on(t1.uin=t2.uin)

複製**

如有乙個表a,如上,記錄了使用者的消費記錄,每類消費一列,現在需要將該錶的列轉化為行,如表b,原來的多列轉化為多行。 如下

這裡有兩種方式可以實現,分布是使用union以及po***plode。

方法一 使用union

union實現方式就是分布取出單列,然後進行對結果進行合併,sql如下。

select uin, 1

astype, of_amt

from t_user_trans

union all

select uin, 2

astype, lf_amt

from t_user_trans

union all

select uin, 3

astype, on_amt

from t_user_trans

union all

select uin, 4

astype, cr_amt

from t_user_trans

複製**

方法二,使用po***plode

explode是內建函式, 支援兩種用法分別是:

explode(array) 列表中的每個元素生成一行。

explode(map) map中每個key-value對,生成一行,key為一列,value為一列。

使用explode(array)沒有type列,因此無法將轉換後的行對應到之前的列,這裡可以使用po***plode來代替,po***plode(array)轉換後,可以獲得列名在陣列中的位置,這樣將位置對應一列進行輸出即可。

select 

uin

t.pos+1

astype,

t.value as amount

from t_user_tans

lateral view

po***plode(

array(

of_amt,

lf_amt,

on_amt,

cr_amt

)) t as pos, value

複製**

有一張使用者登陸流水表,需要計算使用者的連續登陸天數,這裡可以使用分組編號,group by uin+時間減分組編號,這樣連續的天數就被聚合在一起了,可以通過聚合函式計算最終結果。

select

uin,

count(uin) as continuity_days

from(

select

uin,

statis_day,

row_number() over(partition

by uin order

by statis_day asc) as rn

from

( select

uin,

statis_day

from t_user_login_log

where statis_day>= 20170101

and statis_day <= 20180809

) )group

by uin, date_sub(statis_day,cast(rn as

int))

複製**

如有t_user_score記錄了學生所有的科目成績,需要取出每個學生分數最高的一門學科。這裡主要用到row_number()函式。

select

uinfrom

( select

uin,

course,

row_number() over(partition

by uin order

by score asc) as rn

from

t_user_score

)where rn = 1

複製**

hive表 合併字段 hive sql常用技巧

1.多行合併 多行合併常用於做區間統計,通過定義一定的金額區級,將上億的記錄降維為不同區間內總數。概括來說就是多對映到一。典型場景 基於使用者交易天流水,計算每天不同金額段的金額筆數。如使用者的天交易流水表結構如上,需要計算出交易額在0 100,100 200,200 300,大於300幾個區級的筆...

hiveSQL常用日期函式

注意 mm,dd,mo,tu 等要大寫 hive 可以在 where 條件中使用 case when 已知日期 要求日期 語句結果 本週任意一天 本周一select date sub next day 2016 11 29 mo 7 2016 11 28 本週任意一天 上週一select date ...

Hive sql 常用的一些方法

1 插入資料 insert into 附加 insert overwrite 清空原資料,再插入,最終表中只有插入的資料。2 字串擷取函式split 正常使用 split a,b,c,d 得到的結果 a b c d 當遇到特殊字元 點 split 192.168.0.1 得到的結果 正確的寫法 sp...