hive sql語句和mysql用法區別存檔

2021-09-05 10:08:03 字數 3385 閱讀 2716

mysql和hive版本:

mysql版本:5.6.17

hive版本:2.1.1

本功能測試基於以下資料表test_group:

1、簡單功能實現對比

需求如下:寫出乙個sql語句,按照category分組,並把組內的name使用「; 」分隔符連線。

(1)mysql中

select 

category,

group_concat(name separator "; ") # separator後面是分隔符

from

test_group

group by

category

結果如下:

group_concat()函式的api如下:

功能:將group by產生的同乙個分組中的值連線起來,返回乙個字串結果。

語法:group_concat( [distinct] 要連線的字段 [order by 排序字段 asc/desc ] [separator 『分隔符』] )

說明:通過使用distinct可以排除重複值;如果希望對結果中的值進行排序,可以使用order by子句;separator是乙個字串值,預設為乙個逗號。

(2)hive中

hive不提供group_concat函式,所以需要使用其他方法代替,我們可以使用concat_ws()函式代替,如下:

select 

category,

concat_ws("\; ", collect_list(name))

from

test_group

group by

category

注意:collect_list表示組內不去重,collect_set表示組內去重,表示將name欄位放到乙個list/set中,在使用concat_ws進行連線。

2、組內排序下的group_concat對比

需求如下:寫出乙個sql語句,按照category分組,並把組內的name和level使用「name-level」格式使用「; 」分隔符連線,並在組內使用level降序排列。

①mysql中

select 

category,

group_concat(concat(name, '-', level) order by level desc separator "; ") as res # order by level desc表示組內排序

from

test_group

group by

category

輸出結果如下:

(2)hive中

select 

temp.category,

concat_ws("\; ", collect_list(concat(tmp.name, '-', tmp.level))) as res # concat(tmp.name, '-', tmp.level)表示將name欄位和level欄位使用『-』連線

from

( select * from test_group order by level desc

) tmp

group by

tmp.category

1、hive中

在hive中,直接提供split函式,使用如下:

hive> select split("1,2,3", ',');     # 返回結果:

hive> select split("1,2,3", ',')[0]; # 返回結果:1

hive> select split("1,2,3", ',')[1]; # 返回結果:2

hive> select split("1,2,3", ',')[2]; # 返回結果:3

2、mysql中

mysql沒有提供split函式,但是可以使用substring函式達到類似的效果。舉例如下:

mysql> select substring_index("1,2,3",",",1);    # 返回結果:1

mysql> select substring_index("1,2,3",",",2); # 返回結果:1,2

mysql> select substring_index("1,2,3",",",3); # 返回結果:1,2,3

mysql> select substring_index("1,2,3",",",-1); # 返回結果:3

mysql> select substring_index("1,2,3",",",-2); # 返回結果:2,3

mysql> select substring_index("1,2,3",",",-3); # 返回結果:1,2,3

負號表示反向取數,和py中功能一樣。

但是如果我們想把2提取出來,該怎麼做?用2個substring(),舉例如下:

mysql> select substring_index(substring_index("1,2,3",',',2),',',-1)    # 返回結果:2

mysql> select substring_index(substring_index("1,2,3",',',-2),',',1) # 返回結果:2

mysql> select substring_index(substring_index("1,2,3",',',3),',',-1) # 返回結果:3

mysql> select substring_index(substring_index("1,2,3",',',-2),',',-1) # 返回結果:3

hive sql 中使用 if 語句

hive sql 中使用 if 語句 hive 是數倉管理中重要的一環,尤其是sql的書寫時大家在執行任務時中最重要的,關係到任務的執行快慢和正確性 今天就來看一下hive中的sql 的使用 案例 insert into table ads sale tm category1 stat mn sel...

hive sql語句對in和not in的替換

對於hive sql裡的子查詢不支援not in或in 目前測試,應該是乙個hive語句裡只能支援乙個not in 或in語句,多了不支援,對not in的替換用 left join id 關聯字段 is null in的替換用left join id is not null替換,或者用left s...

mysql資料傾斜 Hive SQL 資料傾斜總結

在海量資料下的資料查詢中,資料傾斜是乙個很恐怖的場景。常常看似很普通的資料查詢,執行了幾個小時也沒有結果,其原因往往是發生了資料傾斜。如果真對資料傾斜採取相應的解決方法,那麼查詢效率將會大大提高。所以,分析資料傾斜是一件相當有意義的任務。本文總結不同情況下的資料傾斜,並分別給出解決方法。資料傾斜 資...