2023.11.16-hive sql高阶函数lateral view,与行转列,列转行

目录

[0.lateral view简介](#0.lateral view简介)

1.行转列

需求1:

需求2:

2.列转行

解题思路:


0.lateral view简介

hive函数 lateral view 主要功能是将原本汇总在一条(行)的数据拆分成多条(行)成虚拟表,再与原表进行笛卡尔积,从而得到明细表。配合UDTF函数使用,一般情况下经常与explode函数搭配,explode的操作对象(列值)是 ARRAY 或者 MAP ,可以通过 split 函数将 String 类型的列值转成 ARRAY 来处理。

炸裂函数配合侧视图使用如下

格式:select 原表别名.字段名,侧视图名.字段名 from 原表 原表别名 lateral view explode(要炸开的字段) 侧视图名 as 字段名 ;

1.行转列

-- 数据准备

--建表

sql 复制代码
create table row2col2(

                         col1 string,

                         col2 string,

                         col3 int

)row format delimited fields terminated by '\t';

--加载数据到表中

sql 复制代码
load data inpath '/input/r2c2.txt' into table row2col2;

-- 验证数据

sql 复制代码
select * from row2col2;

需求1:

需求1: 把原表数据变成以下格式

a b [1,2,3]

c d [4,5,6]

思路:使用collect_list()函数有序不去重

sql 复制代码
select
    col1,
    col2,
    collect_list(col3) -- 先将col3收集
from row2col2
group by
    col1, col2;

需求2:

需求2: 把原表数据变成以下格式

a b '1-2-3'

c d '4-5-6'

思路:1,2,3已经知道怎么收集了,可以用concat来将这几个数字与符号-拼接起来

concat_ws():函数在连接字符串的时候,只要有一个字符串不是NULL,就不会返回NULL。concat_ws():函数需要指定分隔符。

但concat_ws只支持拼接字符串,所以需要先用cast强转成字符串

  • cast(内容 as 类型)
  • concat_ws的格式: select concat_ws('要拼接的分隔符','字符串1','字符串2');
sql 复制代码
select col1,col2,
       concat_ws('-',(collect_list(cast(col3 as string))))
from row2col2
group by col1, col2
;

2.列转行

1.准备数据

sql 复制代码
--创建表
create table col2row2(
                         col1 string,
                         col2 string,
                         col3 string
)row format delimited fields terminated by '\t';

2.加载数据

sql 复制代码
--加载数据
load data  inpath '/source/c2r2.txt' into table col2row2;

3.验证数据

sql 复制代码
select * from col2row2;

解题思路:

sql 复制代码
-- 单列数据先切割再炸开
-- explode只能炸一个参数,只能接收数组或映射作为参数
select explode(col3)from col2row2; --报错
--无法直接炸col3字段,因为是字符串类型,并且题中的1,2,3并不是'一个'参数

select split(col3,',') from col2row2;
--用split切割后,会将切割完的数据放进数组里 [""1"",""2"",""3""][""4"",""5"",""6""]

select explode(split(col3,',')) from col2row2;
--得到了数组后,可以用explode来炸了

使用lateral view生成最终的表

格式:select 原表别名.字段名,侧视图名.字段名 from 原表 原表别名 lateral view explode(要炸开的字段) 侧视图名 as 字段名 ;

sql 复制代码
select col2row2.col1 , col2row2.col2 ,c2r.col3_explode
from col2row2
lateral view
explode(split(col3,',')) c2r as col3_explode  --用lv函数造出虚拟表c2r,col3_explode是字段名
;
相关推荐
GEO_Huang几秒前
企业转型无从下手?数谷的定制化 AI 方案能否指点迷津?
大数据·人工智能·aigc·rpa·geo·企业智能体定制·企业ai定制
珠海西格电力1 小时前
零碳园区全面感知体系的建设成本和收益分析包含哪些关键数据?
大数据·数据库·人工智能·智慧城市·能源
QYR_112 小时前
光模块行业全景解析:全球市场规模、格局分布及发展趋势(2026-2032)
大数据·人工智能
华科易迅2 小时前
SQL学习
java·sql·学习
程序员花萍雨2 小时前
【SQL 极简速通 1/5】从手动搬砖到声明式“点菜”
sql
九硕智慧建筑一体化厂家3 小时前
什么是楼宇自控?全面解析楼宇自控与楼宇自控系统的作用
大数据·运维·人工智能·网络协议·制造
TTc_3 小时前
对于子查询语句多条sql报错排查
数据库·sql·mybatis
灰化肥发挥3 小时前
韩国草药制剂数据查询:如何获取MFDS注册数据与韩国药典标准?
大数据·人工智能·医药数据库
小王毕业啦3 小时前
2010-2023年 地级市-破产法庭设立数据(+文献)
大数据·人工智能·数据挖掘·数据分析·社科数据·经管数据·破产法庭
雷焰财经3 小时前
从系统承建到生态赋能:宇信科技全球化战略的纵深与逻辑
大数据·人工智能·科技