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

这篇具有很好参考价值的文章主要介绍了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';

hive 中将一行数据按分隔符拆分成多行,Hive,hive,hadoop,数据仓库

用到的函数: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';

hive 中将一行数据按分隔符拆分成多行,Hive,hive,hadoop,数据仓库

 step2:一行变成多行

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

hive 中将一行数据按分隔符拆分成多行,Hive,hive,hadoop,数据仓库

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

hive 中将一行数据按分隔符拆分成多行,Hive,hive,hadoop,数据仓库

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';

hive 中将一行数据按分隔符拆分成多行,Hive,hive,hadoop,数据仓库

但还不是我们想要的最终结果,还需要把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';

hive 中将一行数据按分隔符拆分成多行,Hive,hive,hadoop,数据仓库文章来源地址https://www.toymoban.com/news/detail-770118.html

到了这里,关于Hive行转列[一行拆分成多行/一列拆分成多列]的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Hive的行列转换(行转多列、多列转行、行转单列、单列转行)

    在实际使用Hive的过程中,常常会涉及到行列转换,细分的话,有下面4种类型的行列转换,分别是: 行转多列 多列转行 行转单列 单列转行 下面我们通过样例介绍每种行列转换的实现方法。 样例表 班级成绩表: 姓名(name) 学科(subject) 成绩(score) 行列转换思路分析及实现 行转

    2024年02月15日
    浏览(80)
  • Hive多行转多列,多列转多行

    原始数据表 目标结果表 分析:目标表中的a和b是用分组形成,所以groupby字段选用原始表中col1,c、d、e是原始表中的行值,在目标表中成了列名,目标表中可以采用as做列名自定义,当原始表中的某一字段值等于某一特定值时,人为定义为结果表中的列名。 SQL实现 总结:多行

    2024年02月12日
    浏览(48)
  • 【hive】行转列—explode()/posexplode()/lateral view 函数使用场景

    功能: 用于和UDTF函数(explode,split)结合使用,把某一行数据拆分成多行数据,再将多行结果组合成一个支持别名的虚拟表。 主要解决select使用UDTF做查询的过程中查询只能包含单个UDTF,不能包含其它字段以及多个UDTF的情况。 语法:LATERAL VIEW udtf(expression) tableAlias AS columnAlia

    2024年04月09日
    浏览(41)
  • 【Hive-SQL】Hive Select 选择语句排除一列或多列

    查看 除了sample_date 以外的所有字段信息 查看 除了sample_date 和 msgtype 以外的所有字段信息 上面的 set hive.support.quoted.identifiers=none; 可以替换操作: 在 \\\'hive-site.xml\\\' 中添加以下配置: hive.support.quoted.identifiers=none

    2024年02月10日
    浏览(42)
  • Hive SQL 中ARRAY或MAP类型数据处理:lateral view explode()/posexplode()——行转列函数

    前言:在对表数据进行批量处理过程中,常常碰上某个字段是一个array或者map形式的字段,一列数据的该字段信息同时存在多个值,当我们需要取出该数组中的每一个值实现一一对应关系的时候,可以考虑使用lateral view explode()/posexplode() 进行处理。 一、提要:explode()本身是

    2024年02月04日
    浏览(48)
  • SQL 将一列拆分成多列

    数据库中有业务表t1和字典表dictionary t1表:                                                                     dictionary表:                                                     需求一:将col列拆分成三列 SQL 代码如下所示: 方法一: 效果: 方法二: 效果:

    2024年02月06日
    浏览(39)
  • SQL实现一行数据分组后转多行多列

    在统计一些指标时,通常会有多个指标需要分组进行聚合,但是 数据源的粒度可能并非是指标分组的粒度 。举个例子,比如从访客表中提取访客的数据,每行数据有每个平台的首次访问时间;另外要做一个平台统计表,其中的一个指标统计的是各个平台近1天、7天、30天的新

    2024年02月14日
    浏览(36)
  • mysql根据逗号将一行数据拆分成多行数据,顺便展示其他列

    2.处理结果  SQL展示 这个join最基本原理是笛卡尔积。通过这个方式来实现循环。 分析: length(a.path) - length(replace(a.path,‘,’,‘’))+1 表示了,按照逗号分割后,分割需要循环的次数。 join过程: 根据ID进行循环 { 判断:i 是否 = n 获取最靠近第 i 个逗号之前的数据, 即 substr

    2024年02月09日
    浏览(45)
  • HIVE 复制行n次直到某一列等于200

    例如需要复制tmp_1表n次,每复制一次,gday+1,直到gday=200, 借助 lateral view posexplode,首先用space复制多个空格字符串,复制次数=200-gday 然后split将字符串分割成数组,此时该数组大小为200-gday 然后lateral view posexplode创建虚拟表,虚拟表大小也为200-gday 用gday+虚拟表的索引,即可

    2024年02月12日
    浏览(50)
  • Mysql行转列函数

    group_concat() 例: select oid from Test;  select group_concat( oid ) from Test;

    2024年02月14日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包