当前位置: 首页 > news >正文

Hive行转列[一行拆分成多行/一列拆分成多列]

场景:

hive有张表armmttxn_tmp,其中有一个字段lot_number,该字段以逗号分隔开多个值,每个值又以冒号来分割料号和数量,如:A3220089:-40,A3220090:-40,A3220091:-40,A3220083:-40,A3220087:-40,A3220086:-40,A3220088:-40,A3220084:-40,A3220081:-40,A3220082:-40,A3220092:-40,A3220093:-40,A3220085:-40,A3220094:-40。

要求:

把该字段拆分开来,并且把料号和数量单独列出,也就是分成两列。

原数据:

select 
key_id,
lot_number 
from armmttxn_tmp
where key_id = '48641906';

用到的函数:split()、explode()

 步骤:

step1:以逗号拆分开,如下:

["A3220089:-40","A3220090:-40","A3220091:-40","A3220083:-40","A3220087:-40","A3220086:-40","A3220088:-40","A3220084:-40","A3220081:-40","A3220082:-40","A3220092:-40","A3220093:-40","A3220085:-40","A3220094:-40"]

使用split函数,把数据拆分开

select 
key_id ,
split(lot_number, ',') lot_number
from armmttxn_tmp
where key_id = '48641906';

 step2:一行变成多行

select 
explode(split(lot_number, ',')) lot_number
from armmttxn_tmp
where key_id = '48641906';

 这里如果加上key_id字段,会怎样呢?

SQL 错误 [10081] [42000]: Error while compiling statement: FAILED: SemanticException [Error 10081]: UDTF's are not supported outside the SELECT clause, nor nested in expressions

原因:当使用UDTF函数的时候,hive只允许对拆分字段进行访问。
所以,可以这样使用:select explode(split(lot_number, ',')) lot_number from armmttxn_tmp where key_id = '48641906'; 

但不可以这样使用:select key_id ,explode(split(lot_number, ',')) lot_number from armmttxn_tmp where key_id = '48641906';

如果想访问除了拆分字段以外 的字段,怎么办呢?
用lateral view侧视图!

lateral view为侧视图,是为了配合UDTF来使用,把某一行数据拆分成多行数据.不加lateral view的UDTF只能提取单个字段拆分,并不能塞会原来数据表中.加上lateral view就可以将拆分的单个字段数据与原始表数据关联上.

注意:在使用lateral view的时候需要指定视图别名

--表名 lateral view UDTF(xxx) 视图别名(虚拟表名) as a,b,c(列别名)

--lateral view explode 相当于一个拆分lot_number字段的虚表,然后与原表进行关联.

step3:拆分的字段与原始表数据关联上.

select 
key_id ,
split(view.*,':') lot_number
from armmttxn_tmp lateral view explode(split(lot_number, ',')) view
where key_id = '48641906';

但还不是我们想要的最终结果,还需要把lot_number拆分成两列

step4: 拆分成两列

select 
key_id ,
split(view.*,':')[size(split(view.*, ':'))-2] as lot_number,
split(view.*,':')[size(split(view.*, ':'))-1] as quantity
from armmttxn_tmp lateral view explode(split(lot_number, ',')) view
where key_id = '48641906';

http://www.lryc.cn/news/171172.html

相关文章:

  • TypeScript系列之类型 string
  • 【C++】动态内存管理 ③ ( C++ 对象的动态创建和释放 | new 运算符 为类对象 分配内存 | delete 运算符 释放对象内存 )
  • AMS爆炸来袭,上线即巅峰
  • 是面试官放水,还是公司实在是太缺人?这都没挂,华为原来这么容易进...
  • 怒刷LeetCode的第2天(Java版)
  • AUTOSAR汽车电子嵌入式编程精讲300篇-车载CAN总线网络的异常检测(续)
  • mojo安装
  • 【探索Linux】—— 强大的命令行工具 P.8(进程地址空间)
  • vue3 - Element Plus 切换主题色及el-button hover颜色不生效的解决方法
  • 【C++面向对象侯捷】1.C++编程简介
  • 年龄大了转嵌入式有机会吗?
  • Mysql高级——索引优化和查询优化(2)
  • SpringMVC的拦截器和JSR303的使用
  • servlet中doGet方法无法读取body中的数据
  • Ubuntu MongoDB账户密码设置
  • 指针进阶(3)
  • 信息检索与数据挖掘 | (二)布尔检索与倒排索引
  • 【学习笔记】EC-Final 2022 K. Magic
  • MySQL数据库笔记
  • 大数据之Hive(三)
  • 让高分辨率的相机芯片输出低分辨率的图片对于像素级的值有什么影响?
  • FastGPT 接入飞书(不用写一行代码)
  • 蓝桥杯 题库 简单 每日十题 day6
  • 使用Arduino简单测试HC-08蓝牙模块
  • 如何在 CentOS 8 上安装 OpenCV?
  • 一台主机外接两台显示器
  • 笔记-搭建和使用docker-registry私有镜像仓库
  • 爬虫框架Scrapy学习笔记-2
  • 6.1 使用scikit-learn构建模型
  • React 全栈体系(十一)