【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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/31807.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【面试干货】抽象类的意义与应用

【面试干货】抽象类的意义与应用 1、为其他子类提供一个公共的类型2、封装子类中重复定义的内容3、定义抽象方法,子类虽然有不同的实现,但是定义时一致的4、示例代码 💖The Begin💖点点关注,收藏不迷路💖 在…

kettle从入门到精通 第七十二课 ETL之kettle 三谈http post(含文件上传),彻底掌握参数传递

场景:群里有个小伙伴在使用http post步骤调用接口时遇到问题,postman调用正常,但是kettle中调用异常。 解决方案:既然postman调用接口正常,肯定是http post步骤中某些参数设置的不正确导致的。那就把常用的方式都梳理下…

探索AI前沿:本地部署GPT-4o,打造专属智能助手!

目录 1、获取API_key 2、开始调用 3、openai连接异常 4、解决方法: 5、调用GPT-4o 1、获取API_key 这里就不多赘述了,大家可以参考下面这篇博客 怎么获取OpenAI的api-key【人工智能】https://blog.csdn.net/qq_51625007/article/details/13763274…

Open WebUI的SearXNG网络搜索配置【403报错解决方法】

1.拉取SearXNG镜像 docker pull searxng/searxng 2.在Docker Desktop的Images界面中启动searxng容器 3.查看searxng是否部署成功 在Docker Desktop的Containers界面中,查看searxgn暴露的端口。 http://localhost:31292/ 4.修改settings.yml配置参数 在Docker De…

shell编程之条件语句(shell脚本)

条件测试操作 要使shell脚本程序具备一定的“智能”,面临的第一个问题就是如何区分不同的情况以确定执行何种操作。例如,当磁盘使用率超过95%时,发送告警信息;当备份目录不存在时,能够自动创建;当源码编译程序时,若配置失败则不再继续安装等。 shell环境根据命令执行后…

[火灾警报系统]yolov5_7.0-pyside6火焰烟雾识别源码

国内每年都会发生大大小小的火灾,造成生命、财产的损失。但是很多火灾如果能够早期发现,并及时提供灭火措施,将会大大较小损失。本套源码采用yolov5-7.0目标检测算法结合pyside6可视化界面源码,当检测到火灾时,能否发出…

模方4.0导出osgb模型一直提示正在运行任务,请取消所有任务后再尝试?

答:可以选择任务列表中的所有瓦块右键,取消全部,然后再选择瓦块导出 模方是一款针对实景三维模型的冗余碎片、水面残缺、道路不平、标牌破损、纹理拉伸模糊等共性问题研发的实景三维模型修复编辑软件。模方4.1新增自动单体化建模功能&#x…

力扣901.股票价格跨度

力扣901.股票价格跨度 单调栈 若当前价格 > 栈顶元素 弹出栈顶元素找到最远的符合要求的 class StockSpanner {stack<pair<int,int>> st;int cur_day -1;public:StockSpanner() {st.emplace(-1,INT_MAX);}int next(int price) {while(price > st.top().s…

链式二叉树

链式二叉树 链式二叉树结构二叉树的遍历二叉树前序遍历二叉树中续遍历二叉树后续遍历二叉树层序遍历 二叉树节点个数和高度等二叉树节点个数二叉树叶子节点个数二叉树第k层节点个数单值二叉树对称二叉树相同的二叉树二叉树的前序遍历二叉树的中序遍历二叉树的后序遍历另一棵树的…

SpringCloud 基于Nacos和Eureka 实现双注册双订阅

一、使用场景/原因 过渡期迁移: 当系统从一个服务注册中心迁移到另一个时&#xff0c;例如从 Eureka 迁移到 Nacos&#xff0c;可以在过渡期内同时使用两个注册中心&#xff0c;确保服务平稳迁移&#xff0c;逐步过渡&#xff0c;避免一次性切换带来的风险。 兼容性考虑: 不同的…

ASP.NET Core 6.0 使用 Log4Net 和 Nlog日志中间件

前言 两年前,浅浅的学过 .NET 6,为啥要记录下来,大概是为了以后搭架子留下引线,还有抛砖引玉。 1. 环境准备 下载 建议使用 Visual Studio 2022 开发版 官网的下载地址:Visual Studio 2022 IDE - 适用于软件开发人员的编程工具借助 Visual Studio 设计,具有自动完成…

混合专家模型和LLAMA的详细配置

文章目录 混合专家模型LLAMA的详细配置混合专家模型 大语言模型能够通过扩展参数规模实现性能的提升。然而,随着模型参数规模的扩大,计算成本也随之增加。为了解决这一问题,研究人员在大语言模型中引入了基于稀疏激活的混合专家架构(Mixture-of-Experts, MoE),旨在不显著…

支付宝推出NFC(近场通信)碰一碰支付功能

近日&#xff0c;支付宝推出NFC&#xff08;近场通信&#xff09;碰一碰支付功能&#xff0c;支持iPhone、安卓手机。NFC支付早已不是新事物&#xff0c;从二维码支付重回NFC支付&#xff0c;支付宝能撬动市场吗&#xff1f; 根据网友反馈&#xff0c;目前支付宝正在上海静安大…

海外社媒网站抓取经验总结:如何更高效实现网页抓取?

有效的网络抓取需要采取战略方法来克服挑战并确保最佳数据提取。让我们深入研究一些关键实践&#xff0c;这些实践将使您能够掌握复杂的网络抓取。 一、了解 Web 抓取检测 在深入探讨最佳实践之前&#xff0c;让我们先了解一下网站如何识别和抵御网络爬虫。了解您在这一过程中…

2-12 基于CV模型卡尔曼滤波、CT模型卡尔曼滤波、IMM模型滤波的目标跟踪

基于CV模型卡尔曼滤波、CT模型卡尔曼滤波、IMM模型滤波的目标跟踪。输出跟踪轨迹及其误差。程序已调通&#xff0c;可直接运行。 2-12 CV模型卡尔曼滤波 CT模型卡尔曼滤波 - 小红书 (xiaohongshu.com)

千年古城的味蕾传奇-平凉锅盔

在甘肃平凉这片古老而神秘的土地上&#xff0c;有一种美食历经岁月的洗礼&#xff0c;依然散发着独特的魅力&#xff0c;那便是平凉锅盔。平凉锅盔&#xff0c;那可是甘肃平凉的一张美食名片。它外表金黄&#xff0c;厚实饱满&#xff0c;就像一轮散发着诱人香气的金黄月亮。甘…

pta 抽象基类Shape派生3个类 C++

7-3 抽象基类Shape派生3个类 分数 10 全屏浏览 作者 沙金 单位 石家庄铁道大学 声明抽象基类Shape,由它派生出三个类&#xff0c;圆形Circle&#xff0c;矩形Rectangle&#xff0c;三角形Triangle&#xff0c;用一个函数输出三个面积。 输入格式: 在一行中依次输入5个数&…

【过度的乐观和自信,得治】为什么数据类项目交付失败的不少?

引言&#xff1a;数据类项目包含数据治理和数据分析类项目&#xff0c;这些是数字化转型中数据能力打造&#xff0c;是基础性的工作。这类项目通常涉及Iaas、Paas和Saas层产品和服务&#xff0c;越靠近业务客户的Saas层交付服务客户满意度低&#xff0c;项目失败的不少&#xf…

白驹过隙,沧海桑田

01. 机缘 今天是我加入CSDN的第2620天&#xff0c;是我成为创作者的第1024天。2021 年 08 月 25 日我在这里分享了人生中第一篇技术文章 springboot 签名验证。 现在在回看这篇文章还能感觉到当时的青涩和技术的薄弱&#xff0c;后面每一篇文章的输出可能都是在不断的学习和进…

Comfy UI使用最新SD3模型,并解决报错‘NoneType‘ object has no attribute ‘tokenize‘【实测可行】

解决Comfy UI使用最新SD3模型报错’NoneType’ object has no attribute ‘tokenize’ 前几天SD3发布了&#xff0c;所以想着尝尝鲜&#xff0c;便去下载了SD3来玩一玩。使用的是Comfy UI而不是Stable Diffusion UI&#xff0c;这是一个比SD UI更加灵活的UI界面&#xff0c;使用…