参考文章:
HiveSql一天一个小技巧:如何不使用union all 进行列转行_不 union all-CSDN博客文章浏览阅读881次,点赞5次,收藏10次。本文给出一种不使用传统U服务器托管网NION ALL方法进行 行转列的方法,其中方法一采用了concat_ws+posexplode()方法,利用posexplode的位置索引实现key-value之间的一一对应,方法二采用explode()+case when的方法,利用case when 进行转换实现key-value之间的一一对应。_不 union allhttps://blog.csdn.net/godlovedaniel/article/details/125019658 列转行(UDTF函数:炸裂:一进多出)
0 需求分析
1 数据准备
create table if not exists table22
(
id int comment '用户id',
name string comment '姓名',
age string comment '年纪',
gender string comment '性别'
);
insert overwrite table table22
values (1, 'mimi','11','0'),
(2, 'geg','32','1');
2 数据分析
方式一:使用union all 的方式行转列
select
id,
'name' as type,
name as value
from table22
union all
select
id,
'age' as type,
age as value
from table22
union all
select
id,
'gender' as type,
gender as value
from table22
order by id;
ps: 使用union all 方式需要注意:上下两段逻辑,对应字段的类型要一致,字段名称也必须一致。
方式二:不使用union all 方法,采用 concat_ws() + posexplode()方法,利用pos的位置索引进行一一对应。(where pos1 = pos2)
完整的代码如下:
select
id,
type,
value
from (
select
t1.id,
tmp1.pos1,
tmp1.item1 as value,
tmp2.pos2,
tmp2.item2 as type
from (
select
id,
concat_ws(',', name, age, gender) as value,
array('name', 'age', 'gender') as type
from table22
) t1
lateral view posexplode(split(value, ',')) tmp1 as pos1, item1
lateral view posexplode(type) tmp2 as pos2, item2
) t2
where pos1 = pos2;
上述的SQL简化如下:
select
id,
item2 as type,
item1 as value
from table22
lateral view posexplode(split(concat_ws(',', name, age, gender), ',')) tmp1 as pos1, item1
lateral view posexplode(array('name', 'age', 'gender')) tmp2 as pos2, item2
where tmp1.pos1 = tmp2.pos2;
explode及posexolode炸裂函数的详细用法见文章:
HiveSQL题——炸裂函数(explode/posexplode)_hive exolode-CSDN博客文章浏览阅读1.2k次,点赞28次,收藏13次。HiveSQL题——炸裂函数(explode/posexplode)_hive exolodehttps://blog.csdn.net/SHWAITME/article/details/135941286?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170753932316800192292655%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=170753932316800192292655&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-2-135941286-null-null.nonecase&utm_term=%E7%82%B8%E8%A3%82%E5%93%88%E6%95%B0&spm=1018.2226.3001.4450
方式三:采用explode() + case when 方法,先用array()函数将字段封装,再利用case when与字段值进行匹配。
select
id,
tmp1.type,
case tmp1.type
when 'name' then name
when 'age' then age
when 'gender' then gender
else null end as value
from table22
lateral view explode(array('name', 'age', 'gender')) tmp1 as type
3 小结
上述案例采用了多种【行转列】的方法,除了常规的union all 上下拼接,还可以利用 concat_ws + posexplode() 结合方式,利用炸裂函数posexplode的下角标pos来实现pos-value的一一服务器托管网对应; 另外还可以利用 explode()+ case when结合方式,用case when进行条件判断,一一匹配。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
相关推荐: 京东一面挂在了CAS算法的三大问题上,痛定思痛不做同一个知识点的小丑
写在开头 在介绍synchronized关键字时,我们提到了锁升级时所用到的CAS算法,那么今天我们就来好好学一学这个CAS算法。 CAS算法对build哥来说,可谓是刻骨铭心,记得是研二去找实习的时候,当时对很多八股文的内容浅尝辄止,很多深奥的知识点只是知道…