Hive SQL 中ARRAY或MAP类型数据处理:lateral view explode()/posexplode()——行转列函数

这篇具有很好参考价值的文章主要介绍了Hive SQL 中ARRAY或MAP类型数据处理:lateral view explode()/posexplode()——行转列函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

一、提要:explode()本身是Hive的自带函数,使用它可以将array或者map中的值逐行输出。

select explode(array('a','b','c','d','e'));

Hive SQL 中ARRAY或MAP类型数据处理:lateral view explode()/posexplode()——行转列函数

select explode(map('A','a','B','b','C','c'));

Hive SQL 中ARRAY或MAP类型数据处理:lateral view explode()/posexplode()——行转列函数

二、应用:lateral view explode()在工作环境中的使用。(lateral view用于和split、explode等UDTF一起使用的,能将一行数据拆分成多行数据,在此基础上可以对拆分的数据进行聚合,lateral view首先为原始表的每行调用UDTF,UDTF会把一行拆分成一行或者多行,lateral view在把结果组合,产生一个支持别名表的临时表。)

如下国家地区表dim_country,需要实现将shortname(array类型)中的国家简写逐个拆分出来实现与id及level的一一对应。

Hive SQL 中ARRAY或MAP类型数据处理:lateral view explode()/posexplode()——行转列函数

 如果只是用explode()会出现报错,因为explode()只能实现将shortname单字段进行炸开,一行变多行,但是id和level只有一行,故无法形成新表,这时候就需要用到lateral view。使用lateral view explode()可以将炸出的多行以临时表tmp的形式存在,其它的字段会进行相应的复制,实现与tmp的一一对应。

select id,level,country 
from dim_country
lateral view explode(shortname)tmp as country ;

Hive SQL 中ARRAY或MAP类型数据处理:lateral view explode()/posexplode()——行转列函数

(tips:即使数组中各元素相同,也都会一一列出)

 三、补充:split()函数的应用

如果需要lateral view explode()的字段类型是string,则需要用split()函数将之拆分成数组,然后再用lateral view explode()处理。同上dim_country表,如果shortname是string类型,则HQL如下,结果相同。

select id,level,country 
from dim_country
lateral view explode(split(shortname,’,’))tmp as country ;

正常数组类型两侧会带有[],但有些时候也可能是string类型,如果是string类型且两侧带有[],则需要先用substring()将两侧的[]去掉,可以考虑用如下方式:

SELECT regexp_replace(substr(shortname,2),substr(substr(shortname,2),-1,1),'');
或 
SELECT substr(shortname,2,length(shortname)-2);

&相关资料:试验过程的建表及插入SQL:

建表语句:
CREATE table dim_country (id bigint,level int,shortname ARRAY<string>);
插入语句(两种形式):
insert into table dim_country values (1,1,array('US','CA','UK'));
insert into dim_country(id,level,shortname) select 1,1,array('US','CA','AE');
insert into dim_country(id,level,shortname) select 1,1,array('US','US');

四、进阶:lateral view explode()在map类型上的使用问题及解决方法(lateral view posexplod() )。

        1、建表

CREATE table dim_map (id bigint,level int,shortname MAP<string,string>)
ROW FORMAT DELIMITED fields terminated by '\t'
collection items terminated by ','
map keys terminated by ':';

        2、插入数据

insert into table dim_map 
values (1,1,str_to_map('yuwen:aaa,shuxue:bbb,yingyu:ccc,wuli:ddd,huaxue:eee'));

insert into dim_map(id,level,shortname) 
values (1,1,str_to_map('yuwen:100,shuxue:98,yingyu:88,wuli:89,huaxue:100'));

Hive SQL 中ARRAY或MAP类型数据处理:lateral view explode()/posexplode()——行转列函数

         3、explode()实现对map类型字段的炸开,形成key和value两段(但只能是map类型字段本身,不能另加别的字段)

SELECT explode(shortname) from dim_map;

Hive SQL 中ARRAY或MAP类型数据处理:lateral view explode()/posexplode()——行转列函数

         4、如果要加另外的字段,需要用到lateral view posexplod() 函数。

SELECT id,level,single_id,single_time from temp.dim_map
LATERAL VIEW posexplode(map_keys(shortname))t as single_id_index,single_id
LATERAL VIEW posexplode(map_values(shortname))t 
as single_time_index,single_time
where single_id_index = single_time_index;

Hive SQL 中ARRAY或MAP类型数据处理:lateral view explode()/posexplode()——行转列函数

posexplode()可以炸开一个数组,会形成两列,一列是自增序列,一列是炸出来的值。上诉方法则是通过自增序列实现一一对应结合。

 posexplode()可以通过与split(space(n))结合,可以实现插入固定的行数。

        5、补充:map_key()和map_value()可以直接对取出一个map中的所有key和所有value

SELECT id,level,map_keys(shortname), map_values(shortname) from temp.dim_map;

Hive SQL 中ARRAY或MAP类型数据处理:lateral view explode()/posexplode()——行转列函数

 五、使用lateral view注意事项:

1. lateral view使用在from后,where前,参照如下格式;

lateral view explode(数组字段)临时表名 as 别名 ;

2. from后可带多个lateral view;

3. 如果要拆分的字段有null值,需要使用lateral view outer 替代,避免数据缺失。

参考链接:

Hive SQL中的lateral view explode_IT农民工1的博客-CSDN博客

http://t.zoukankan.com/share23-p-10173311.html 

Hive-sql中的explode()函数和posexplode()函数_sql中explode_有语忆语的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-442873.html

到了这里,关于Hive SQL 中ARRAY或MAP类型数据处理:lateral view explode()/posexplode()——行转列函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • HIVE SQL通过Lateral View + explode实现列转行

    原表: a b Andy 碟中谍,谍影重重,007 MOMO 小鞋子,朋友啊你的家在哪里 David ‘’ Lily NULL 实现效果 a b Andy 碟中谍 Andy 谍影重重 Andy 007 MOMO 小鞋子 MOMO 朋友啊你的家在哪里 David ‘’ 实现代码: 注: explode函数:处理map结构的字段,将数组转换成多行,所以此处使用了split函数将

    2024年02月12日
    浏览(25)
  • 利用Hadoop处理离线数据:Hive和Spark离线数据处理实现

    作者:禅与计算机程序设计艺术 引言 随着大数据时代的到来,越来越多的数据产生于各种业务系统。这些数据往往需要在离线环境中进行处理,以降低数据处理的时间和成本。Hadoop作为目前最为流行的分布式计算框架,提供了强大的离线数据处理能力。Hive和Spark作为Hadoop生

    2024年02月11日
    浏览(30)
  • 大二暑期实习记录(一):处理组件绑定数据错误(数组解构,map()方法)

    好家伙,搬砖   今天在做组件迁移(从一个旧平台迁移到一个新平台)的时候,发现了一些小小的问题:   在穿梭框组件中,使用\\\" 节点配置 \\\"方法添加数据的时候,左测数据选择框直接消失了 这里我们猜测一下,大概是数据处理出了问题 此处,我们使用 \\\"数据绑定\\\" 绑定数据方法:    定

    2024年02月15日
    浏览(34)
  • Sqoop将hive处理的数据导出到MySQL

    目录 部署前提 一、创建数据上传到hive中 创建学生表数据:vim stu.txt 创建课程表数据:vim course.txt 在hive中创建学生表和课程表: 上传数据到hdfs上的hive中: 二、处理hive中的数据 查询学生姓名和课程信息,创建结果表stu_result: 插入数据: 三、在mysql中创建结果表 四、将hive中处

    2024年02月03日
    浏览(31)
  • Hive、HBase对比【相同:HDFS作为底层存储】【区别:①Hive用于离线数据的批处理,Hbase用于实时数据的处理;②Hive是纯逻辑表,无物理存储功能,HBase是物理表,放非结构数据】

    1. Hive是hadoop数据仓库管理工具,严格来说,不是数据库,本身是不存储数据和处理数据的,其依赖于HDFS存储数据,依赖于MapReducer进行数据处理。 2. Hive的优点是学习成本低,可以通过类SQL语句(HSQL)快速实现简单的MR任务,不必开发专门的MR程序。 3. 由于Hive是依赖于MapRed

    2024年04月17日
    浏览(32)
  • 【Sql Server】通过Sql语句批量处理数据,使用变量且遍历数据进行逻辑处理

    欢迎来到《小5讲堂》,大家好,我是全栈小5。 这是《Sql Server》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握。 温馨提示:博主能力有限,理解水

    2024年03月15日
    浏览(36)
  • Hadoop3.0大数据处理学习1(Haddop介绍、部署、Hive部署)

    学习步骤: 三大组件的基本理论和实际操作 Hadoop3的使用,实际开发流程 结合具体问题,提供排查思路 开发技术栈: Linux基础操作、Sehll脚本基础 JavaSE、Idea操作 MySQL Hadoop是一个适合海量数据存储与计算的平台。是基于Google的GoogleFS、Map Reduce、BigTable实现的。 移动数据:数据

    2024年02月08日
    浏览(37)
  • Pandas文本数据处理大全:类型判断、空白字符处理、拆分与连接【第67篇—python:文本数据】

    Pandas是Python中一种强大的数据分析库,广泛用于数据清洗、处理和分析。在实际的数据处理中,文本数据常常是不可避免的一部分。本篇博客将介绍Pandas中处理文本数据的一些常用技巧,包括类型判断、去除空白字符、拆分和连接。 在处理文本数据时,首先要了解数据的类型

    2024年02月19日
    浏览(33)
  • Mybatis 处理 CLOB/BLOB 类型数据

    BLOB 和 CLOB 都是大型字段类型。 BLOB通过二进制存储,而CLOB可以直接存储文本。 通常,图片、文件、音乐等信息存储在 BLOB 字段中。首先,文件是转换为二进制,然后存储在。文章或较长的文本存储在 CLOB 中。 不同数据库中相应的 BLOB 和 CLOB 类型也不同: 在MySQL中,clob对应

    2024年02月15日
    浏览(25)
  • 软件测试|Pydantic处理时间类型数据

    简介 我们之前介绍过使用 pydantic 验证数据,比如校验数据的格式等,但是在我们的日常工作中,还有一种数据是需要我们验证的,比如时间数据,时间数据不同于字符串,列表等数据,与他们的验证不一样,本文就来为大家介绍一下 pydantic 如何验证时间数据。 datetime时间类

    2024年01月16日
    浏览(26)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包