【hive】lateral view侧视图

文档地址:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+LateralView

  • 1.介绍
  • 2.语法
  • 3.code demo
    • 1)单重侧视图
    • 2)多重侧视图
    • 3)tips:lateral view outer

1.介绍

lateral view也叫侧视图,属于hive sql所特有的语法。用来实现类似标准sql中join的操作。但区别在于:

  • join参与运算的往往是两个表,根据指定的关联字段进行横向连接。
  • lateral view参与运算的是一张表,这张表里往往存在某个多值的字段,通过侧视图结合UDTF函数可以将这个多值字段拆分为粒度更小的值,每一个拆分出来的值都会作为新的字段和一条原记录进行拼接。类似于列转行操作,虽然严格意义上不算列转行,因为只是增加了行数,但并未减少列数,只是减少了列中所包含的字段个数。

2.语法

selectsrc.*,tb_alias.col_alias
from src lateral view UDTF(src.col) tb_alias as col_alias [, col_alias, ...];

以上只是一个基本的语法参考,tb_alias为表别名,这里的表指的是UDTF所返回的虚拟表。as col_alias [, col_alias, ...]是给这个虚拟表的字段指定别名,方便后续引用。返回的虚拟表中有几个字段,就得指定几个别名,业务中一般只返回一个。

关于字段别名,文档里说的是从hive 0.12.0字段别名可以省略,此时它继承自UDTF函数在定义时指定的字段名,但仅做了解即可,按照上面语法通用就不必要做一些非必要的改动。
在这里插入图片描述

重点是理解上述代码的逻辑执行过程,UDTF会根据传入的字段先返回一张虚拟表,此时虚拟表的表名和字段名分别被命名为tb_alias col_alias,然后通过lateral view,将虚拟表的每条记录关联到原来所属的记录上去,类似于join操作,只不过不需要我们显式指定on的字段,hive内部会自己识别原来属于哪条记录并关联。最后再从这张结果表中select我们需要的字段就可以了。

3.code demo

1)单重侧视图

with src as (select '张三' as name, '唱;跳;rap'as skillsunion allselect '李四' as name, '唱;跳'as skills
)
selectsrc.*,tb.col_name
from src lateral view explode(split(skills,';')) tb as col_name;

output:
在这里插入图片描述

2)多重侧视图

多重侧视图的执行过程是在上一步侧视图结果的基础上,再进行一次lateral view操作,所以对于后面的lateral view,是可以直接引用前面lateral view结果表中的字段的。

下面通过代码对二重lateral view拆开分步演示,可以更好的理解执行逻辑。
step1:

with src as (select '张三' as name, map('语文', '71;72;73', '数学', '81;82;83') as colunion allselect '李四' as name, map('语文', '90') as col
)
select src.*,tb1.subject,tb1.score
from src lateral view explode(col) tb1 as subject, score;

output:
在这里插入图片描述

step2,基于step1的结果,对成绩score列的值继续展开:

with src as (select '张三' as name, map('语文', '71;72;73', '数学', '81;82;83') as colunion allselect '李四' as name, map('语文', '90') as col
)
select src.*,tb1.subject,tb1.score,tb2.score_detail
from src lateral view explode(col) tb1 as subject, scorelateral view explode(split(tb1.score, ';')) tb2 as score_detail;

output:
在这里插入图片描述
当然,如果需要,可以继续lateral view下去。

3)tips:lateral view outer

有一个点需要注意,就是实际任务中UDTF的返回结果可能存在空值null的情况,对于这种情况,hive会丢失原表中的数据行,因为本身lateral view就类似于join操作,关联不上那就丢失了。

例如:

with src as (select '张三' as name, '唱;跳;rap'as skillsunion allselect '李四' as name, null as skills
)
selectsrc.*,tb.col_name
from src lateral view explode(split(skills,';')) tb as col_name;

output:
在这里插入图片描述
可以看到原始数据“李四”的信息就丢失了,同时需要注意这里的空值指的是null,而不是空字符串,这是两种不同的概念,比如下面这段sql:

with src as (select '张三' as name, '唱;跳;rap'as skillsunion allselect '李四' as name, '' as skills       -- 这里修改null为空字符串''
)
selectsrc.*,tb.col_name
from src lateral view explode(split(skills,';')) tb as col_name;

output:
在这里插入图片描述

为了规避这种可能造成数据丢失的情况,hive从0.12.0版本及之后提供了lateral view outer来解决。这种方式可以理解为标准sql中的left join,即使UDTF返回的结果为null,也会保留原表的这条数据。具体见代码:

with src as (select '张三' as name, '唱;跳;rap'as skillsunion allselect '李四' as name, null as skills
)
selectsrc.*,tb.col_name
from src lateral view outer explode(split(skills,';')) tb as col_name;

output:
在这里插入图片描述

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

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

相关文章

(JDK11)根据文件的Url输出该文件的Base64

由于和外部对接的时候需求要把一个文件的url输出为base64码,我这里参考了博客: JAVA–根据Url下载文件数据(输出Base64) 但由于我用的是JDK11的,已经没有rt.jar的包了,而该博客里使用的是jdk8的BASE64Encoder,所以这个…

C++ 之 【类与对象】从入门到精通一条龙服务 最终篇(static成员、友元、匿名对象。。。)

💴到用时方恨早,白首方悔挣的少 车到山前没有路,悬崖勒马勒不住 一、再谈构造函数 1.构造函数体赋值 2.初始化列表 3.explicit关键字 二、Static成员 1.概念 2.特性 三、友元 1.友元函数 2.友元类 四、内部类 五、匿名对象 六、…

BOM管理软件

BOM(Bill of Materials,物料清单)管理软件是企业进行产品设计、物料采购、生产计划、成本核算等环节不可或缺的工具。这类软件主要功能包括创建和维护物料清单、管理物料信息、支持多层次的BOM结构、进行物料需求计算、生成采购计划、与ERP/M…

js: UrlDecode解码、UUID和GUID、阿拉伯数字转为中文数字

UrlDecode解码: UrlDecode 是一个 JavaScript 函数,用于将经过 URL 编码的字符串转换为普通字符串。 URL 编码是将特殊字符转换为它们的百分比编码表示形式的过程。这些特殊字符包括空格、斜线、井号(#)等。UrlDecode 函数将这些…

Python中的多线程 pool.map的学习

代码地址https://github.com/Pointcept/Pointcept/blob/main/pointcept/datasets/preprocessing/s3dis/preprocess_s3dis.py 数据处理中使用ProcessPoolExecutor进行多线程处理 1、import from concurrent.futures import ProcessPoolExecutor2、创建ProcessPoolExecutor对象…

JWT技术选型以及相关功能的实现

一.技术选型 1.为什么不用SessionCookie,而要用Token? 【1】无状态 什么是无状态服务 无状态服务是指在处理请求时不存储任何会话信息或状态信息的服务。这意味着每个请求都是独立且相互独立的,服务不会在请求之间保留任何状态。 Session-Cookie方…

面试stm32基础知识

1.ISP 第一步进入bootloader模式:先置BOOT0为高,BOOT1为低,再复位单片机进入bootloader模式,之后通过上位机下载程序; 第二步配置启动代码的地方:代码下载完毕后,置BOOT0为低,BOOT1…

lambda捕获列表

lambda是C11新特性之一,优点是: 1.可以直接匿名定义目标函数或函数对象,不需要额外写一个函数 2.lambda是一个匿名的内联函数 捕获列表 总结:【】为值捕获,只读 【&】为引用捕获,可读可写

Day104:漏洞发现-漏扫项目篇武装BURP浏览器插件信息收集分析辅助遥遥领先

目录 插件类-武装BurpSuite-漏洞检测&分析辅助 1、如何加载插件: 2、漏洞检测类: Fiora TsojanScan RouteVulScan APIKit 3、分析辅助类: 插件类-武装谷歌浏览器-信息收集&情报辅助 HackBar Heimdallr Wappalyzer FindS…

每日一题:买卖股票的最佳时机IV

给你一个整数数组 prices 和一个整数 k ,其中 prices[i] 是某支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。也就是说,你最多可以买 k 次,卖 k 次。 注意:你不能同时参与多…

HTML合集

前言: 之前所有HTNL的文章都是单独写出,本篇文章,将他们作为集合的形式进行整理。 链接(点击查看): HTML简介 网页的基本结构 HTML基础语法 HTML元素之间的关系 HTML的常用标签 HTML常用标签的补充 …

Linux进阶篇:性能监控工具:socket 统计信息

Linux性能监控工具:socket 统计信息 1 ss命令介绍 ss 是 Socket Statistics 的缩写。ss 命令可以用来获取 socket 统计信息,它显示的内容和 netstat 类似。但 ss 的优势在于它能够显示更多更详细的有关 TCP 和连接状态的信息,而且比 netsta…

ArtCoder——通过风格转换生成多元化艺术风格二维码

简介 ArtCoder能够从原始图像(内容)、目标图像(风格)以及想要嵌入的信息中,生成具有艺术风格的二维码。这一过程类似于通常的图像风格转换,但特别针对二维码的特点进行了优化和调整。 通过这种方法&#…

轮转数组(力扣)

189. 轮转数组 - 力扣(LeetCode) 189. 轮转数组 题解 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 样例输入 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮…

图像生成模型浅析(Stable Diffusion、DALL-E、Imagen)

目录 前言1. 速览图像生成模型1.1 VAE1.2 Flow-based Model1.3 Diffusion Model1.4 GAN1.5 对比速览 2. Diffusion Model3. Stable Diffusion3.1 Text Encoder3.2 Decoder3.3 Generation Model 总结参考 前言 简单学习下图像生成模型的相关知识🤗 以下内容来自于李宏…

Spring框架中的11种设计模式(设计模式之美)

适配器模式 例如Controller的三种实现方式: Controller注解实现Controller接口 xml配置文件:配置DemoController与URL的对应关系实现Servlet接口 xml配置文件:配置DemoController类与URL的对应关系 不同的Controller如何调用呢?可以通过适配器模式。…

链表传一级指针以及leetcode做题有感

上个文章说要传二级指针,经过一段时间的学习之后才知道可以传一级指针: 之所以要传二级指针,是要改变一级指针的值,也就是把头节点的指针改变,如图: 从左边到右边,头指针 一级指针plist 的值发…

JS stacktrace 堆内存耗尽

javascript 堆内存耗尽 问题 是 npm run dev 的时候 报错 如下 <--- JS stacktrace --->FATAL ERROR: MarkCompactCollector: young object promotion failed Allocation failed - JavaScript heap out of memory在大多数情况下&#xff0c;默认情况下 Node.js 的堆内存…

【Cocoapods】最新安装指定版本Cocoapods记录

安装ruby https://blog.csdn.net/mydo/article/details/126918391 # 指定版本安装 sudo gem install -n /usr/local/bin cocoapods -v 1.9.3 接下来一定要注意&#xff01;注意&#xff01;注意&#xff01; 如果你的 Mac系统是 10.11 之前&#xff0c;输入&#xff1a; sud…

深入理解Transformer技术原理 | 得物技术

谷歌在2017年发布Transformer架构的论文时&#xff0c;论文的标题是&#xff1a;Attention Is All You Need。重点说明了这个架构是基于注意力机制的。 一、什么是注意力机制 在深入了解Transformer的架构原理之前&#xff0c;我们首先要了解下&#xff0c;什么是注意力机制。…