在Hive sql应用中会遇到“行转列”和“列转行”的场景,下面介绍其基本使用语法。
1.行转列:
关键字:collect_set() / collect_list()、concat_ws()
1)collect_set()/collect_list():
collect_set( )函数只接受基本数据类型,作用是对参数字段进行去重汇总,返回array类型字段;
collect_list()函数和collect_set( )作用一样,只是前者不去重,后者去重。
2)concat_ws():
concat_ws (separator,字符串A/字段名A,字符串B/字段名B…)是concat的特殊形式,第一个参数是分隔符,分隔符会放到要连接的字符串之间,分隔符可以是字符串,也可以是其他参数。如果分隔符为NULL,则结果为NULL,函数会忽略任何分隔符参数后的 NULL值。但是concat_ws( )不会忽略任何空字符串。(然而会忽略所有的 NULL),如果参数为string类型数组则合并数组内字符串。
例:concat_ws( ‘,’, [ ‘a ‘, ‘b’])–> ‘a,b’
行转列基本语法:
select 分类字段,concat_ws(’,’,collect_set(合并字段)) as 别名 from table_name group 分类字段;
/* 原始数据
name gender times
张三 男 唐
李四 男 唐
王五 男 明
赵六 男 明
*/
-- 先用collect_set将列拼接在一起,然后再通过concat_ws进行展开拼接
SELECT a.gender_times,
concat_ws(';',collect_set()) name
FROM
(SELECT name,
concat(gender, '_','times') gender_times
FROM hero_info) t
GROUP BY t.gender_times;
/*查询结果
gender_times name
男_唐 张三;李四
男_明 王五;赵六
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
2.列转行
关键字:explode()、split()和LATERAL VIEW
1) split()****:
将一个字符串按照指定字符分割,结果为一个array;
2)explode():
将一列复杂的array或者map拆分为多行,它的参数必须为map或array;
3)lateral view:
lateral view udtf(字段名)表别名/表临时名as列别名/列临时名。lateral view用于和split, explode等UDTF一起使用,它能够将一行数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。lateral view首先为原始表的每行调用UDTF,UTDF会把一行拆分成一或者多行,lateralview再把结果组合,产生一个支持别名表的虚拟表。
列转行基本语法:
select字段,字段别名from table_name lateral view explode(split(拆分字段,分隔符))表别名 as 字段别名;
/*原始数据
province city
河南 郑州市,开封市,洛阳市
河北 石家庄市,保定市
湖南 长沙市,岳阳市,常德市
*/
-- addr为表名
SELECT province,
city_n
FROM addr LATERAL VIEW explode (split(city,',')) addr_tmp AS city_n;
/*
-- 查询结果
河南 郑州市
河南 开封市
河南 洛阳市
河北 石家庄市
河北 保定市
湖南 长沙市
湖南 岳阳市
湖南 常德市
*/
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
最后
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
小编已加密:aHR0cHM6Ly9kb2NzLnFxLmNvbS9kb2MvRFVrVm9aSGxQZUVsTlkwUnc==出于安全原因,我们把网站通过base64编码了,大家可以通过base64解码把网址获取下来。