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

打印 上一主题 下一主题

主题 526|帖子 526|积分 1578

目录

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


-- 数据准备

--建表

  1. create table row2col2(
  2.                          col1 string,
  3.                          col2 string,
  4.                          col3 int
  5. )row format delimited fields terminated by '\t';
复制代码
--加载数据到表中


  1. load data inpath '/input/r2c2.txt' into table row2col2;
复制代码
-- 验证数据

  1. select * from row2col2;
复制代码
 需求1:


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

思绪:使用collect_list()函数有序不去重
  1. select
  2.     col1,
  3.     col2,
  4.     collect_list(col3) -- 先将col3收集
  5. from row2col2
  6. group by
  7.     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');
  1. select col1,col2,
  2.        concat_ws('-',(collect_list(cast(col3 as string))))
  3. from row2col2
  4. group by col1, col2
  5. ;
复制代码


2.列转行

1.准备数据
  1. --创建表
  2. create table col2row2(
  3.                          col1 string,
  4.                          col2 string,
  5.                          col3 string
  6. )row format delimited fields terminated by '\t';
复制代码
2.加载数据
  1. --加载数据
  2. load data  inpath '/source/c2r2.txt' into table col2row2;
复制代码
3.验证数据
  1. select * from col2row2;
复制代码


解题思绪:

  1. -- 单列数据先切割再炸开
  2. -- explode只能炸一个参数,只能接收数组或映射作为参数
  3. select explode(col3)from col2row2; --报错
  4. --无法直接炸col3字段,因为是字符串类型,并且题中的1,2,3并不是'一个'参数
  5. select split(col3,',') from col2row2;
  6. --用split切割后,会将切割完的数据放进数组里 [""1"",""2"",""3""][""4"",""5"",""6""]
  7. select explode(split(col3,',')) from col2row2;
  8. --得到了数组后,可以用explode来炸了
复制代码

使用lateral view生成终极的表
格式:select 原表别名.字段名,侧视图名.字段名 from 原表 原表别名 lateral view explode(要炸开的字段) 侧视图名 as 字段名 ;
  1. select col2row2.col1 , col2row2.col2 ,c2r.col3_explode
  2. from col2row2
  3. lateral view
  4. explode(split(col3,',')) c2r as col3_explode  --用lv函数造出虚拟表c2r,col3_explode是字段名
  5. ;
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

忿忿的泥巴坨

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表