2023.11.16-hive sql高阶函数lateral view,与行转列,列转行
创始人
2024-11-12 03:35:33
0

目录

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.行转列

-- 数据准备

--建表

create table row2col2(                           col1 string,                           col2 string,                           col3 int  )row format delimited fields terminated by '\t';

--加载数据到表中

load data inpath '/input/r2c2.txt' into table row2col2;

-- 验证数据

select * from row2col2;

 需求1:


需求1: 把原表数据变成以下格式
a b [1,2,3]
c d [4,5,6]


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

 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');
select col1,col2,        concat_ws('-',(collect_list(cast(col3 as string)))) from row2col2 group by col1, col2 ;

2.列转行

1.准备数据

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

2.加载数据

--加载数据 load data  inpath '/source/c2r2.txt' into table col2row2;

3.验证数据

select * from col2row2;

解题思路:

-- 单列数据先切割再炸开 -- 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 字段名 ;

select col2row2.col1 , col2row2.col2 ,c2r.col3_explode from col2row2 lateral view explode(split(col3,',')) c2r as col3_explode  --用lv函数造出虚拟表c2r,col3_explode是字段名 ;

相关内容

热门资讯

更值得关注的是!胡乐麻将辅助(... 更值得关注的是!胡乐麻将辅助(辅助)好像存在有辅助技巧(确实有挂)1、许多玩家不知道胡乐麻将辅助辅助...
第三方辅助!天天辅助器下载(辅... 第三方辅助!天天辅助器下载(辅助)一贯真的有辅助器(确实有挂)1、很好的工具软件,可以解锁游戏的天天...
此事备受玩家关注!奇迹山西辅助... 此事备受玩家关注!奇迹山西辅助器(辅助)竟然真的有辅助脚本(有挂攻略)1、进入游戏-大厅左侧-新手福...
反观!微乐家乡官方app下载(... 反观!微乐家乡官方app下载(辅助)竟然真的是有辅助器(存在有挂)1、微乐家乡官方app下载公共底牌...
来临!免费游戏辅助软件(辅助)... 来临!免费游戏辅助软件(辅助)其实是真的有辅助教程(有挂解密)小薇(辅助器软件下载)致您一封信;亲爱...
今天下午!雀神广东定制插件辅助... 今天下午!雀神广东定制插件辅助(辅助)其实是真的有辅助教程(今日头条)1、上手简单,内置详细流程视频...
无独有偶!微信黑科技辅助神器(... 无独有偶!微信黑科技辅助神器(辅助)总是确实有辅助app(有挂透明挂)1、不需要AI权限,帮助你快速...
黑科技技巧!小闲辅助神器(辅助... 黑科技技巧!小闲辅助神器(辅助)一直真的是有辅助挂(有挂方法)亲,关键说明,小闲辅助神器透视脚本安卓...
值得注意的是!wepoker插... 值得注意的是!wepoker插件程序(辅助)真是是真的有辅助技巧(有挂解密)1、许多玩家不知道wep...
有玩家发现!天天海南家园辅助(... 您好,天天海南家园辅助这款游戏可以开挂的,确实是有挂的,需要了解加去威信【136704302】很多玩...