Hive SQL 之 `LATERAL VIEW EXPLODE` 的正确打开方式

news2024/12/25 2:09:51

一文彻底搞懂 LATERAL VIEW EXPLODE

1. 引言

在处理复杂数据结构(如数组、映射)时,Hive SQL 提供了强大的功能来简化查询和数据分析。其中,LATERAL VIEWEXPLODE 是两个特别有用的关键字,它们可以帮助我们将复杂的数据类型拆分成更易处理的行格式。本文将详细介绍 LATERAL VIEW EXPLODE 的概念、应用场景以及具体使用方法。


2. 概念定义

LATERAL VIEW
  • 定义LATERAL VIEW 是 Hive SQL 中用于结合表生成函数(Table Generating Functions, TGFs)的一个关键字。它允许我们在同一个查询中对一个表执行额外的操作,例如调用 EXPLODE 函数。
  • 作用:通过 LATERAL VIEW,我们可以为每个输入行生成多个输出行,并将这些新生成的行与原始数据合并,形成一个新的结果集。
EXPLODE
  • 定义EXPLODE 是一种表生成函数,它接收一个数组或映射作为输入,并为输入中的每一个元素生成一行输出。
  • 特点:如果输入是一个数组,则每一行代表数组中的一个元素;如果是映射,则每一行包含键值对中的一个键及其对应的值。
LATERAL VIEW EXPLODE
  • 组合使用LATERAL VIEW EXPLODE 组合使用时,可以将复杂的数据结构(如数组或映射)转换成多行记录,使得原本难以处理的数据变得更加直观和易于分析。
  • 好处:简化了对复杂数据类型的查询逻辑,提高了查询效率和灵活性。

3. 语法详解

语法结构
LATERAL VIEW [OUTER] EXPLODE(column) alias AS column_name
  • LATERAL VIEW:这是必须的关键词,表示接下来要应用一个表生成函数。
  • [OUTER]:可选关键词。默认情况下,EXPLODE 只会处理非空数组或映射。如果你希望保留原表中的所有行,即使某些行的指定列为空或为 NULL,可以使用 OUTER 关键词。
  • EXPLODE(column):这是实际的表生成函数,column 表示你要展开的数组或映射列名。
  • alias:给由 EXPLODE 操作产生的临时结果集起一个别名。这有助于在外层查询中引用这些新生成的行。
  • AS column_name:为 EXPLODE 操作后的新列命名。这个新列将包含从原数组或映射中提取出来的单个元素。
示例语法

假设有一个表 users,其中有一列 hobbies 是一个数组:

SELECT id, hobby
FROM users
LATERAL VIEW EXPLODE(hobbies) exploded_hobbies AS hobby;

在这个例子中:

  • LATERAL VIEW 表示我们将在当前查询上下文中引入一个表生成函数。
  • EXPLODE(hobbies)hobbies 数组中的每个元素都转换成一行新的 hobby 列。
  • exploded_hobbies 是给由 EXPLODE 操作产生的结果集起的别名。
  • AS hobby 定义了新生成的列名为 hobby
使用 OUTER 关键词

如果你想确保即使 hobbies 列为空或为 NULL 的行也保留在结果集中,可以使用 OUTER 关键词:

SELECT id, hobby
FROM users
LATERAL VIEW OUTER EXPLODE(hobbies) exploded_hobbies AS hobby;

4. 使用场景

LATERAL VIEW EXPLODE 在以下场景中尤为有用:

  • 从数组或映射中提取信息:当你有一个包含多个值的数组或映射列,并希望将这些值展开成独立的行进行进一步分析时。
  • 处理嵌套数据结构:对于存储在 JSON 或其他嵌套格式中的数据,可以通过 EXPLODE 来扁平化这些结构,便于后续操作。
  • 聚合复杂数据:当需要对复杂数据类型中的元素进行统计或聚合时,EXPLODE 可以帮助你将这些元素拆分出来,方便计算。

5. 实际应用案例

案例1:数组直接展开

假设我们有一个日志表 logs,其中有一列 tags 存储的是用户标签的数组,如下所示:

idtags
1[‘admin’, ‘user’]
2[‘user’]

我们想要知道每个标签出现的次数。这时就可以使用 LATERAL VIEW EXPLODE

SELECT tag, COUNT(*) as count
FROM logs
LATERAL VIEW EXPLODE(tags) exploded_tags AS tag
GROUP BY tag;

这段代码会将 tags 数组中的每个元素都转换成一行新的 tag 列,并统计每个标签的出现次数。结果可能如下:

tagcount
admin1
user2

案例2:先加工成数组,再展开

在实际的数据处理中,有时我们会遇到以逗号分隔的字符串(CSV 格式),例如一个用户的兴趣爱好可能被存储为一个逗号分隔的字符串。为了更好地分析这些数据,我们可以先使用 SPLIT 函数将字符串转换成数组,然后再用 LATERAL VIEW EXPLODE 将这个数组展开成多行。

假设我们有一个表 users,其中有一列 interests 存储的是用户兴趣爱好的逗号分隔字符串,如下所示:

idnameinterests
1Alicemusic,books
2Bobsports,games,books

我们想要将每个用户的兴趣爱好单独列出,并统计每个兴趣爱好的出现次数。可以按照以下步骤进行操作:

步骤 1: 使用 SPLIT 函数生成数组

首先,我们需要将 interests 列中的逗号分隔字符串转换成数组。这可以通过 SPLIT 函数实现,该函数接收一个字符串和一个分隔符作为参数,并返回一个数组。

SELECT id, name, SPLIT(interests, ',') as interest_array
FROM users;

这段代码会将 interests 列中的每个逗号分隔字符串转换成一个数组 interest_array

步骤 2: 使用 LATERAL VIEW EXPLODE 展开数组

接下来,我们将使用 LATERAL VIEW EXPLODE 来将 interest_array 数组中的每个元素都转换成一行新的 interest 列。

SELECT id, name, interest
FROM (
  SELECT id, name, SPLIT(interests, ',') as interest_array
  FROM users
) t
LATERAL VIEW EXPLODE(interest_array) exploded_interests AS interest;

在这段代码中:

  • 内层查询将 interests 列中的逗号分隔字符串转换成了数组 interest_array
  • LATERAL VIEW EXPLODE(interest_array) 将数组中的每个元素都转换成一行新的 interest 列。
  • exploded_interests 是给由 EXPLODE 操作产生的结果集起的别名。
  • AS interest 定义了新生成的列名为 interest

执行上述查询后,结果将会是:

idnameinterest
1Alicemusic
1Alicebooks
2Bobsports
2Bobgames
2Bobbooks
步骤 3: 统计每个兴趣爱好的出现次数

最后,我们可以对展开后的兴趣爱好进行统计,计算每个兴趣爱好的出现次数:

SELECT interest, COUNT(*) as count
FROM (
  SELECT id, name, SPLIT(interests, ',') as interest_array
  FROM users
) t
LATERAL VIEW EXPLODE(interest_array) exploded_interests AS interest
GROUP BY interest;

这段代码会统计每个兴趣爱好的出现次数,结果可能是:

interestcount
music1
books2
sports1
games1

6. 操作层面

  1. 准备数据:确保你的表中包含至少一列是数组或映射类型,或者是一个逗号分隔的字符串。
  2. 编写查询
    • 如果是逗号分隔的字符串,使用 SPLIT 函数将其转换成数组。
    • 使用 LATERAL VIEW 关键字引入 EXPLODE 操作。
    • 指定要展开的数组或映射列名。
    • 使用 AS 关键字为新生成的列命名。
  3. 执行查询:运行你的查询语句,查看由 EXPLODE 产生的新行。
  4. 分析结果:根据需要对生成的新行进行进一步的筛选、排序或聚合操作。

示例代码:

-- 将 users 表中 interests 字段的逗号分隔字符串转换成数组并展开成多行
SELECT id, name, interest
FROM (
  SELECT id, name, SPLIT(interests, ',') as interest_array
  FROM users
) t
LATERAL VIEW EXPLODE(interest_array) exploded_interests AS interest;

7. 常见问题与解决方案

  • 问题LATERAL VIEW EXPLODE 后,原始列不见了怎么办?

    • 解决方案:在外层 SELECT 语句中明确指定你需要的所有列,包括原始列和新生成的列。你可以使用子查询别名来引用原始列,如 t.interest,还是来举个🌰:

      SELECT t.id, t.name, t.interest,exploded_interests.interest_new
      FROM (
       SELECT id, name, SPLIT(interests, ',') as interest_array
       FROM users
      ) t
      LATERAL VIEW EXPLODE(t.interest_array) exploded_interests AS interest_new;
      

      当然,当你explode后生成的字段和原始字段本身就不冲突时,可以忽略掉表名,简化如下:

      SELECT t.id, t.name, interest, interest_new
      FROM (
        SELECT id, name, SPLIT(interests, ',') as interest_array
        FROM users
      ) t
      LATERAL VIEW EXPLODE(t.interest_array) exploded_interests AS interest_new;
      

      一般给出的示例代码都是下面这样的,这样在外层 SELECT 的时候,EXPLODE 新生成 interests 就会把内层的 interests 给覆盖掉,导致内层的 interests 不见了,这样主要是为了简化写法,从使用角度当然是没问题的,这个地方其实丢掉了内层原始 interests 字段;这个地方涉及到变量作用域的问题,展开说其实有点多,有心的同学这个地方可以稍微注意一下!!!

      SELECT t.id, t.name, interest, interest_new
      FROM (
        SELECT id, name, SPLIT(interests, ',') as interest_array
        FROM users
      ) subquery
      LATERAL VIEW EXPLODE(t.interest_array) subquery AS interests;
      
  • 问题:如何处理空数组或 NULL 值?

    • 解决方案EXPLODE 函数会跳过空数组或 NULL 值,不会产生任何新行。如果你需要保留这些行,可以在 LATERAL VIEW 后添加 OUTER 关键字,例如 LATERAL VIEW OUTER EXPLODE(...)

8. 总结

LATERAL VIEW EXPLODE 是 Hive SQL 中处理复杂数据结构的强大工具,它能够将数组或映射等复杂类型转换成易于处理的行格式。通过本文的学习,你应该已经掌握了它的基本概念、应用场景及具体的使用方法。实践是最好的老师,尝试将这些知识应用于实际工作中,你会发现它极大地提升了数据处理的效率和灵活性。

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

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

相关文章

深度学习之目标检测——RCNN

Selective Search 背景:事先不知道需要检测哪个类别,且候选目标存在层级关系与尺度关系 常规解决方法:穷举法,在原始图片上进行不同尺度不同大小的滑窗,获取每个可能的位置 弊端:计算量大,且尺度不能兼顾 Selective …

LOS/NLOS环境建模与三维TOA定位,MATLAB仿真程序,可自定义锚点数量和轨迹点长度

本代码的主要功能是建模 LOS(视距)和 NLOS(非视距)环境下的定位系统,估计目标的动态位置,三维空间 文章目录 运行结果源代码代码介绍 总结 运行结果 10个点的轨迹定位: 50个点的轨迹定位&#…

企业内训|高智能数据构建、Agent研发及AI测评技术内训-吉林省某汽车厂商

吉林省某汽车厂商为提升员工在AI大模型技术方面的知识和实践能力,举办本次为期8天的综合培训课程。本课程分为两大部分:面向全体团队成员的AI大模型技术结构与行业应用,以及针对技术团队的高智能数据构建与Agent研发。课程内容涵盖非结构化数…

专业的内外网数据交换方案 可解决安全、效率、便捷3大问题

内外网数据交换是很多企业和行业都会面临的场景,既然隔离了内外网,重中之重就是要确保数据的安全性,其次在数据流转交换过程中,不能太繁琐复杂,需要让用户快速、便捷的进行数据交换。首先我们来看看,在进行…

【linux】NFS实验

NFS服务 NFS是Network File System(网络文件系统)的缩写。它是一种用于在计算机网络中共享文件和目录的协议。NFS允许计算机上的用户访问和操作远程计算机上的文件,就像访问本地文件一样。它使用客户端-服务端模型,其中客户端机器…

2024年Python最新下载安装教程,附详细图文,持续更新

大家好,我是Python老安,今天为大家带来的是Windows Python3下载、安装教程,适用于 Python3 所有版本,包括 Python3.7,Python33.8,Python33.10 等版本。希望对大家有所帮助 Python目前已支持所有主流操作系统,在Linux,…

职业技能赛赛后心得

这是一位粉丝所要求的,也感谢这位粉丝对我的支持。 那么本篇文章我也是分成四个部分,来总结一下这次赛后心得。 赛中问题 那么这里的赛中问题不会只包含我所遇到的问题,也会包含赛中其他选手出现的问题。 那么首先我先说一下我在赛中遇到的…

WordPress File Upload 插件 任意文件读取漏洞复现(CVE-2024-9047)

0x01 产品简介 WordPress File Upload插件是一款功能强大的WordPress站点文件上传插件,它允许用户在WordPress站点中的文章、页面、侧边栏或表单中轻松上传文件到wp-contents目录中的任何位置。该插件使用最新的HTML5技术,确保在现代浏览器和移动设备上都能流畅运行,同时也…

没想到互联网大厂都喜欢问MySQL中的数据类型?

🎥 作者简介: CSDN\阿里云\腾讯云\华为云开发社区优质创作者,专注分享大数据、Python、数据库、人工智能等领域的优质内容 🌸个人主页: 长风清留杨的博客 🍃形式准则: 无论成就大小,…

YOLOv8 引入高效的可变形卷积网络 DCNv4 | 重新思考用于视觉应用的动态和稀疏算子

我们介绍了可变形卷积v4(DCNv4),这是一种为广泛的视觉应用设计的高效且有效的算子。DCNv4通过以下两项关键改进解决了其前身DCNv3的局限性: 在空间聚合中移除softmax归一化,以增强其动态特性和表达能力。优化内存访问,减少冗余操作以提高速度。这些改进使得DCNv4相比DCNv…

入侵他人电脑,实现远程控制(待补充)

待补充 在获取他人无线网网络密码后,进一步的操作是实现入侵他人电脑,这一步需要获取对方的IP地址并需要制作自己的代码工具自动化的开启或者打开对方的远程访问权限。 1、获取IP地址(通过伪造的网页、伪造的Windows窗口、hook,信…

C++中的字符串实现

短字符串优化(SSO) 实现1 实现2 写时复制 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<cstdio> #include<cstring> #include<cstring> using std::cout; using std::endl;// 引用计数存放的位置 // 1. 存放在栈上 --- 不行 // 2. 存…

clickhouse解决suspiciously many的异常

1. 问题背景 clickhouse安装在虚拟机上&#xff0c;持续写入日志时&#xff0c;突然关机&#xff0c;然后重启&#xff0c;会出现clickhouse可以正常启动&#xff0c;但是查询sql语句&#xff0c;提示suspiciously many异常&#xff0c;如图所示 2. 问题修复 touch /data/cl…

JVM系列(十三) -常用调优工具介绍

最近对 JVM 技术知识进行了重新整理&#xff0c;再次献上 JVM系列文章合集索引&#xff0c;感兴趣的小伙伴可以直接点击如下地址快速阅读。 JVM系列(一) -什么是虚拟机JVM系列(二) -类的加载过程JVM系列(三) -内存布局详解JVM系列(四) -对象的创建过程JVM系列(五) -对象的内存分…

Y3编辑器教程7:界面编辑器

文章目录 一、简介1.1 导航栏1.2 画板1.3 场景界面1.4 控件1.4.1 空节点1.4.2 按钮1.4.3 图片1.4.4 模型1.4.5 文本1.4.6 输入框1.4.7 进度条1.4.8 列表 1.5 元件1.5.1 简介1.5.2 差异说明1.5.3 元件实例的覆盖、还原与禁止操作1.5.4 迷雾控件 1.6 属性1.7 事件&#xff08;动画…

重温设计模式--状态模式

文章目录 状态模式&#xff08;State Pattern&#xff09;概述状态模式UML图作用&#xff1a;状态模式的结构环境&#xff08;Context&#xff09;类&#xff1a;抽象状态&#xff08;State&#xff09;类&#xff1a;具体状态&#xff08;Concrete State&#xff09;类&#x…

MySQL的分析查询语句

【图书推荐】《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;》-CSDN博客 《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;&#xff08;数据库技术丛书&#xff09;》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…

题解 洛谷 Luogu P1135 奇怪的电梯 广度优先搜索 BFS C/C++

题目传送门&#xff1a; P1135 奇怪的电梯 - 洛谷 | 计算机科学教育新生态https://www.luogu.com.cn/problem/P1135思路&#xff1a; 一道比较裸的 BFS&#xff0c;就是把走迷宫每次搜周围相邻四格&#xff0c;改成了楼层每次搜上下方向的某层而已 感觉这个题难度只有普及- …

git 删除鉴权缓存及账号信息

在Windows系统下 清除凭证管理器中的Git凭据 按下Win R键&#xff0c;打开“运行”对话框&#xff0c;输入control&#xff0c;然后回车&#xff0c;打开控制面板。在控制面板中找到“用户账户”&#xff0c;然后点击“凭据管理器”。在凭据管理器中&#xff0c;找到“Windows…

2024 高频 Java 面试合集整理 (1000 道附答案解析)

2024 年马上就快要过去了&#xff0c;总结了上半年各类 Java 面试题&#xff0c;初中级和中高级都有&#xff0c;包括 Java 基础&#xff0c;JVM 知识面试题库&#xff0c;开源框架面试题库&#xff0c;操作系统面试题库&#xff0c;多线程面试题库&#xff0c;Tcp 面试题库&am…