HiveSQL——不使用union all的情况下进行列转行

参考文章:

HiveSql一天一个小技巧:如何不使用union all 进行列转行_不 union all-CSDN博客文章浏览阅读881次,点赞5次,收藏10次。本文给出一种不使用传统UNION 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 数据准备

sql 复制代码
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 的方式行转列

sql 复制代码
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)

完整的代码如下:

sql 复制代码
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简化如下:

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与字段值进行匹配。

sql 复制代码
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进行条件判断,一一匹配。

相关推荐
武子康1 天前
大数据-242 离线数仓 - DataX 实战:MySQL 全量/增量导入 HDFS + Hive 分区(离线数仓 ODS
大数据·后端·apache hive
SelectDB2 天前
易车 × Apache Doris:构建湖仓一体新架构,加速 AI 业务融合实践
大数据·agent·mcp
武子康2 天前
大数据-241 离线数仓 - 实战:电商核心交易数据模型与 MySQL 源表设计(订单/商品/品类/店铺/支付)
大数据·后端·mysql
IvanCodes2 天前
一、消息队列理论基础与Kafka架构价值解析
大数据·后端·kafka
武子康3 天前
大数据-240 离线数仓 - 广告业务 Hive ADS 实战:DataX 将 HDFS 分区表导出到 MySQL
大数据·后端·apache hive
字节跳动数据平台4 天前
5000 字技术向拆解 | 火山引擎多模态数据湖如何释放模思智能的算法生产力
大数据
武子康4 天前
大数据-239 离线数仓 - 广告业务实战:Flume 导入日志到 HDFS,并完成 Hive ODS/DWD 分层加载
大数据·后端·apache hive
字节跳动数据平台5 天前
代码量减少 70%、GPU 利用率达 95%:火山引擎多模态数据湖如何释放模思智能的算法生产力
大数据
得物技术5 天前
深入剖析Spark UI界面:参数与界面详解|得物技术
大数据·后端·spark
武子康5 天前
大数据-238 离线数仓 - 广告业务 Hive分析实战:ADS 点击率、购买率与 Top100 排名避坑
大数据·后端·apache hive