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

寫在前面

mysql和hive版本:
mysql版本:5.6.17
hive版本:2.1.1

一、GROUP_CONCAT功能

本功能測試基於以下數據表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 

結果如下:
在這裏插入圖片描述

二、字符串的split功能

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

三、row_number、rank和dense_rank()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章