寫在前面
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