【Hive SQL】Hive Sql 列转行(lateral view 与 explode 、posexplode)详解

2024-06-21 18:12

本文主要是介绍【Hive SQL】Hive Sql 列转行(lateral view 与 explode 、posexplode)详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Hive Sql

Hive Sql 列转行(lateral view 与 explode 、posexplode)详解

explode

描述

将hive某列一行中复杂的 array 或 map 结构拆分成多行(只能输入array或map)。
通常,explode函数会与lateral view一起结合使用;

语法
explode(col)
select explode(arraycol) as newcol from tablename;// explode():函数中的参数传入的是arrary数据类型的列名;
// newcol:是给转换成的列命名一个新的名字,用于代表转换之后的列名;
// ablename:原表名;select explode(mapcol) as (keyname,valuename) from tablename;// map是kay-value结构的,所以它在转换的时候会转换成两列,一列是kay转换而成的,一列是value转换而成的。
// keyname:表示key转换成的列名称,用于代表key转换之后的列名。
// valuename:表示value转换成的列名称,用于代表value转换之后的列名称。
// 注意:这两个值需要在as之后用括号括起来然后以逗号分隔。
示例
// explode(array) 使得结果中将array列表里的每个元素生成一行;
select explode(array(1,2,3,4)) as col;
"""+------+| col  |+------+| 1    || 2    || 3    || 4    |+------+
"""
// explode(map)使得结果中将map里的每一对元素作为一行,key为一列,value为一列;
select explode(map('a',1,'b',2)) as (k,v);
"""+-----+-----+| k   | v   |+-----+-----+| a   | 1   || b   | 2   |+-----+-----+
"""

posexplode

描述

对一列进行炸裂可以使用 explode()函数,但是如果想实现对两列都进行多行转换,那么用explode()函数就不能实现了,可以用posexplode()函数,因为该函数可以将index和数据都取出来,使用两次posexplode并令两次取到的index相等就行了。

语法
posexplode(col)
select posexplode(arraycol) as (pos,val) from tablename;// posexplode():函数中的参数传入的是arrary数据类型的列名;
// pos:是给转换成的数组列中的数组下标 index
// val: 是给转换成的列命名一个新的名字,用于代表转换之后的列名;
// ablename:原表名;
示例
select posexplode(array('a','b','c','d'));
"""+------+------+| pos  | val  |+------+------+| 0    | a    || 1    | b    || 2    | c    || 3    | d    |+------+------+
"""

Lateral view

描述

lateral view与用户定义的表生成函数(如explode())一起使用。如内置表生成函数中所述,UDTF为每个输入行生成零个或多个输出行。Lateral view首先将UDTF应用于基表的每一行,然后将结果输出行与输入行连接,以形成具有所提供的表别名的虚拟表。

lateral view 主要解决在select使用UDTF做查询的过程中查询只能包含单个UDTF,
不能包含其它字段以及多个UDTF的情况(不能添加额外的select列的问题);

一个 from 子句可以有多个 lateral view 子句。后续的 lateral views 可以引用出现在 lateral view 左侧的任何表格中的列。

语法
// 方式一
lateral view udtf(expression) tableAlias as columnAlias (,columnAlias)*// lateral view在UDTF前使用,表示连接UDTF所分裂的字段;
// UDTF(expression):使用的UDTF函数,例如explode();
// tableAlias:表示UDTF函数转换的虚拟表的名称;
// columnAlias:
// 表示虚拟表的虚拟字段名称,如果分裂之后有一个列,则写一个即可;
//      如果分裂之后有多个列,按照列的顺序在括号中声明所有虚拟列名,以逗号隔开;
//      从 Hive 0.12.0 开始,可以省略列别名;// 方式2
lateral view outer udtf(expression) tableAlias as columnAlias (,columnAlias)*// outer : udtf 函数中指定的列值为 null 时,添加 outer 结果会显示包含 null 的这一行数据,否则会过滤掉此行数据;
// 为了避免 当udtf 没有得到任何结果时最终虚拟结果表里丢失原数据行的问题。
// 由于later view 的工作原理是将原表与 udtf 产生的虚拟表做 inner join 操作,所以如果 udtf 不产生任何结果时,那么对应原表的那一行也会在 inner join 操作后消失。
// outer关键字就是来解决这个问题的,加上这个关键字之后执行的就是 outer join 操作了,因此原表数据会被完全保留下来。// 注:
//     1)lateral view的位置是from后where条件前 
//     2)生成的虚拟表的表名不可省略 
//     3)from后可带多个lateral view,之间用空格分隔; 
//     3)如果要拆分的字段有null值,需要使用lateral view outer 替代,避免数据缺失;
示例
// lateral view
select *
from (select "Jane" as name,array(88,99,110) as score union all select "Sherry" as name,array(88,99,null) as score union all select "Abel" as name,null as score) A
lateral view explode(score) tmp as ss
"""+-----------+-------------------+-------+| name      | score             | ss    |+-----------+-------------------+-------+| Jane      | [88, 99, 110]     | 88    || Jane      | [88, 99, 110]     | 99    || Jane      | [88, 99, 110]     | 110   || Sherry    | [88, 99, NULL]    | 88    || Sherry    | [88, 99, NULL]    | 99    || Sherry    | [88, 99, NULL]    | \N    |+-----------+-------------------+-------+// lateral view outer
select *
from (select "Jane" as name,array(88,99,110) as score union all select "Sherry" as name,array(88,99,null) as score union all select "Abel" as name,null as score) A
lateral view outer explode(score) tmp as ss+-----------+-------------------+-------+| name      | score             | ss    |+-----------+-------------------+-------+| Jane      | [88, 99, 110]     | 88    || Jane      | [88, 99, 110]     | 99    || Jane      | [88, 99, 110]     | 110   || Sherry    | [88, 99, NULL]    | 88    || Sherry    | [88, 99, NULL]    | 99    || Sherry    | [88, 99, NULL]    | \N    || Abel      | \N                | \N    |+-----------+-------------------+-------+
"""// from 后跟多个 lateral view子句select myCol1,myCol2
from (select array(1, 2) as col1,array("a", "b", "c") as col2 union all select array(3, 4) as col1,array("d", "e", "f") as col2) A
lateral view explode(col1) myTable1 as myCol1
lateral view explode(col2) myTable2 as myCol2;+---------+---------+| myCol1  | myCol2  |+---------+---------+| 1       | a       || 1       | b       || 1       | c       || 2       | a       || 2       | b       || 2       | c       || 3       | d       || 3       | e       || 3       | f       || 4       | d       || 4       | e       || 4       | f       |+---------+---------+

官方文档 :
1、Lateral View
2、Hive UDFs

这篇关于【Hive SQL】Hive Sql 列转行(lateral view 与 explode 、posexplode)详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1081962

相关文章

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

Python标准库之数据压缩和存档的应用详解

《Python标准库之数据压缩和存档的应用详解》在数据处理与存储领域,压缩和存档是提升效率的关键技术,Python标准库提供了一套完整的工具链,下面小编就来和大家简单介绍一下吧... 目录一、核心模块架构与设计哲学二、关键模块深度解析1.tarfile:专业级归档工具2.zipfile:跨平台归档首选3.

SQL Server跟踪自动统计信息更新实战指南

《SQLServer跟踪自动统计信息更新实战指南》本文详解SQLServer自动统计信息更新的跟踪方法,推荐使用扩展事件实时捕获更新操作及详细信息,同时结合系统视图快速检查统计信息状态,重点强调修... 目录SQL Server 如何跟踪自动统计信息更新:深入解析与实战指南 核心跟踪方法1️⃣ 利用系统目录

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

idea的终端(Terminal)cmd的命令换成linux的命令详解

《idea的终端(Terminal)cmd的命令换成linux的命令详解》本文介绍IDEA配置Git的步骤:安装Git、修改终端设置并重启IDEA,强调顺序,作为个人经验分享,希望提供参考并支持脚本之... 目录一编程、设置前二、前置条件三、android设置四、设置后总结一、php设置前二、前置条件

python中列表应用和扩展性实用详解

《python中列表应用和扩展性实用详解》文章介绍了Python列表的核心特性:有序数据集合,用[]定义,元素类型可不同,支持迭代、循环、切片,可执行增删改查、排序、推导式及嵌套操作,是常用的数据处理... 目录1、列表定义2、格式3、列表是可迭代对象4、列表的常见操作总结1、列表定义是处理一组有序项目的

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

Mysql中设计数据表的过程解析

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My... 目录1.引言2.NOT NULL——制定某列不可以存储NULL值2.UNIQUE——保证某一列的每一