一、行转列
1.1、行转列需要用到的函数
CONCAT(string A/col, string B/col…):返回输入字符串连接后的结果,支持任意个输入字符串。
例如: concat( aa, ‘:’, bb) 就相当于把aa列和bb列用冒号连接起来了,aa:bb。
CONCAT_WS(separator, str1, str2,…):CONCAT_WS() 代表 CONCAT With Separator ,是CONCAT()的特殊形式。第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。如果分隔符为 NULL,则结果为 NULL。函数会忽略任何分隔符参数后的 NULL 值。但是CONCAT_WS()不会忽略任何空字符串。 (然而会忽略所有的 NULL)。
COLLECT_SET(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生array类型字段。
1.2、真题实战
1.2.1、需求
user_name province city
张三 广东 广州
李四 河南 开封
王二 广东 深圳
小亮 河南 开封
小明 广东 深圳
如上面表格是hive表user_info里的数据,现在想把省份和城市一样的用户放到一起,想要的结果如下:
place users
广东,广州 张三
广东,深圳 王二|小明
河南,开封 李四|小亮
题目分析:
SELECT
t.place AS place,
CONCAT_WS('|', COLLECT_SET(t.user_name)) AS users
FROM
(
SELECT
user_name,
CONCAT(province, ',', city) AS place
FROM
user_info
) t
GROUP BY
t.place;
二、列转行
2.1、列转行需要用到的函数
EXPLODE(col):将hive某列中复杂的array或者map结构拆分