十四、Hive 视图 Lateral View

作者:IvanCodes
日期:2025年5月20日
专栏:Hive教程

Hive中,我们经常需要不同于原始表结构的方式查看或处理数据。为了简化复杂查询提供数据抽象,以及处理复杂数据类型(如数组或Map),Hive 提供了视图 (View) 和 Lateral View 这样强大的机制

思维导图

在这里插入图片描述
在这里插入图片描述

一、Hive 视图 (View):数据的逻辑窗口

Hive 视图是一个虚拟表,它的内容由一个查询定义。视图本身不存储任何物理数据,而是在被查询时动态执行其定义SELECT语句,并返回结果

视图的优势:

  1. 简化复杂性:将多表连接、复杂函数、聚合封装在视图中,用户只需查询简单的视图。
  2. 数据抽象隐藏底层表物理细节。若底层表结构改变,只需修改视图定义,上层应用可能无需变动
  3. 访问控制:可以创建只暴露部分列或符合特定条件行的视图,增强数据安全性
  4. 逻辑重用相同的查询逻辑定义一次,多处使用,便于维护。

基本视图操作:

(1) 创建视图 (CREATE VIEW)

CREATE VIEW [IF NOT EXISTS] view_name
[(column_list)]
[COMMENT view_comment]
AS SELECT_statement;

示例: 假设有 employees (id, name, department_id, salary) 和 departments (id, name) 表。

CREATE VIEW employee_department_details_view
COMMENT 'Shows employee name, salary, and their department name'
AS
SELECT e.name AS employee_name, e.salary, d.name AS department_name
FROM employees e
JOIN departments d ON e.department_id = d.id;

(2) 查询视图

SELECT * FROM employee_department_details_view WHERE salary > 60000;

(3) 查看视图定义

SHOW CREATE TABLE employee_department_details_view;

(4) 修改视图 (ALTER VIEW)

ALTER VIEW [db_name.]view_name AS SELECT_statement;

格式:

ALTER VIEW employee_department_details_view AS
SELECT e.name AS emp_name, e.salary, d.name AS dept_name, e.id AS emp_id -- 修改了列名并增加了列
FROM employees e
JOIN departments d ON e.department_id = d.id;

(5) 删除视图 (DROP VIEW)

DROP VIEW [IF EXISTS] [db_name.]view_name;

格式:

DROP VIEW IF EXISTS employee_department_details_view;

二、Lateral View:行转列的魔法

有时,我们的Hive表中会包含数组 (ARRAY)映射 (MAP) 这样的复杂数据类型。如果我们希望将这些集合类型中的每个元素键值对 “展开” 成单独的行,以便进行更细致的分析,这时就需要Lateral View

Lateral View 通常与表生成函数 (UDTF, User-Defined Table-generating Function) 一起使用,最常用的 UDTF 就是 explode()explode() 函数可以接收一个数组或Map作为输入,并为数组中的每个元素Map中的每个键值对输出一行

Lateral View 的工作方式:
Lateral View首先将 UDTF 应用基表每一行。然后,它将UDTF的输出行原始的输入行进行连接 (join),形成新的虚拟表行

语法:

SELECT ...
FROM base_table
LATERAL VIEW udtf(expression) table_alias AS column_alias_1 [, column_alias_2, ...];
  • udtf(expression): 表生成函数及其参数,如 explode(array_column)explode(map_column)
  • table_alias: 为 Lateral View 生成的虚拟表指定的别名。
  • column_alias_1, ...: 为 UDTF 输出的列指定的别名。explode(array) 只输出一列,explode(map) 输出两列 (key, value)。

示例1:展开数组
假设有一个表 user_hobbies (user_id INT, hobbies ARRAY)。

-- 假设 user_hobbies 表数据:
-- 1, ['reading', 'hiking']
-- 2, ['coding', 'gaming', 'reading']SELECT user_id, single_hobby
FROM user_hobbies
LATERAL VIEW explode(hobbies) exploded_hobbies_table AS single_hobby;

查询结果将会是:

1, reading
1, hiking
2, coding
2, gaming
2, reading

示例2:展开Map
假设有一个表 product_attributes (product_id INT, attributes MAP<STRING, STRING>)。

-- 假设 product_attributes 表数据:
-- 101, {'color':'red', 'size':'M'}
-- 102, {'material':'cotton', 'brand':'XYZ'}SELECT product_id, attr_key, attr_value
FROM product_attributes
LATERAL VIEW explode(attributes) exploded_attributes_table AS attr_key, attr_value;

查询结果将会是:

101, color, red
101, size, M
102, material, cotton
102, brand, XYZ

三、在视图定义中使用 Lateral View

Lateral View强大之处在于它可以被包含视图的 AS SELECT 定义中。这样,我们就可以创建一个视图永久性地提供这种展开后的数据展现形式

示例:创建一个视图来展示每个用户的单个爱好

CREATE VIEW user_individual_hobbies_view AS
SELECT user_id, single_hobby
FROM user_hobbies
LATERAL VIEW explode(hobbies) exploded_hobbies_table AS single_hobby;-- 后续查询
SELECT * FROM user_individual_hobbies_view WHERE user_id = 1;

四、视图(含Lateral View)的特性与注意事项

  1. 非物化:Hive 视图(包括使用了 Lateral View 的视图)默认不存储实际数据。每次查询时,都会重新执行其定义,确保数据最新
  2. 只读性:通常不能通过视图对底层表进行 INSERT, UPDATE, DELETE 操作。
  3. 性能考量:复杂的视图定义,特别是涉及多个Lateral View深层嵌套时,可能会影响查询性能。需要关注底层表优化 (如分区、分桶)。
  4. ORDER BY 限制:视图定义中的 SELECT 不推荐直接使用 ORDER BY (除非配合 LIMIT)。排序应在最终查询视图时应用。

总结: Hive 视图提供了数据的逻辑抽象层,而 Lateral View 则是处理和转换数组、Map等复杂结构强大工具。将两者结合使用,可以极大地增强数据分析和展现灵活性与便捷性


练习题

背景数据表:

  • products (product_id INT, product_name STRING, category STRING, price DECIMAL(8,2), tags ARRAY)
  • sales (sale_id INT, product_id INT, sale_date STRING, quantity INT, customer_id INT, sale_details MAP<STRING, STRING>)
  • customers (customer_id INT, customer_name STRING, city STRING)

请根据以下表结构和数据自行插入一些样例数据用于测试。
例如:
products 表中一条数据: (1, 'Laptop X', 'Electronics', 1200.00, array('slim', 'powerful', '15-inch'))
sales 表中一条数据: (101, 1, '2023-01-15', 1, 201, map('channel','online', 'promo_code','SAVE10'))

题目:

  1. 创建一个视图 product_basic_info_view,显示所有产品的 product_id, product_name, 和 price
  2. 创建一个视图 product_tags_expanded_view,将 products 表中的 tags 数组展开,每行显示 product_id, product_name 和一个单独的 tag
  3. 创建一个视图 sales_details_expanded_view,将 sales 表中的 sale_details Map展开,每行显示 sale_id, product_id,以及Map中的 detail_keydetail_value
  4. 创建一个视图 electronics_product_tags_view,只显示类别 (category) 为 ‘Electronics’ 的产品的 product_name 和其展开后的每个 tag
  5. 创建一个视图 total_quantity_per_product_view,显示每个 product_name 的总销售数量 (total_quantity)。
  6. 基于第5题的 total_quantity_per_product_view,创建一个新视图 high_sales_products_view,只显示 total_quantity 大于10的产品。
  7. 修改第2题创建的 product_tags_expanded_view,使其额外显示产品的 category
  8. 查看 sales_details_expanded_view 的创建语句。
  9. 假设有一个视图 customer_purchase_channels_view,它通过展开 sales.sale_details (假设其中有 ‘channel’ key) 来显示每个客户 (customer_name) 的购买渠道。请写出创建这个视图的SQL语句 (需要连接 customerssales 表)。
  10. 删除视图 product_basic_info_view

答案

  1. 创建 product_basic_info_view:
CREATE VIEW product_basic_info_view AS
SELECT product_id, product_name, price
FROM products;
  1. 创建 product_tags_expanded_view:
CREATE VIEW product_tags_expanded_view AS
SELECT p.product_id, p.product_name, single_tag
FROM products p
LATERAL VIEW explode(p.tags) exploded_tags_table AS single_tag;
  1. 创建 sales_details_expanded_view:
CREATE VIEW sales_details_expanded_view AS
SELECT s.sale_id, s.product_id, detail_key, detail_value
FROM sales s
LATERAL VIEW explode(s.sale_details) exploded_details_table AS detail_key, detail_value;
  1. 创建 electronics_product_tags_view:
CREATE VIEW electronics_product_tags_view AS
SELECT p.product_name, single_tag
FROM products p
LATERAL VIEW explode(p.tags) exploded_tags_table AS single_tag
WHERE p.category = 'Electronics';
  1. 创建 total_quantity_per_product_view:
CREATE VIEW total_quantity_per_product_view AS
SELECT p.product_name, SUM(s.quantity) AS total_quantity
FROM sales s
JOIN products p ON s.product_id = p.product_id
GROUP BY p.product_name;
  1. 创建 high_sales_products_view:
CREATE VIEW high_sales_products_view AS
SELECT product_name, total_quantity
FROM total_quantity_per_product_view
WHERE total_quantity > 10;
  1. 修改 product_tags_expanded_view:
ALTER VIEW product_tags_expanded_view AS
SELECT p.product_id, p.product_name, p.category, single_tag
FROM products p
LATERAL VIEW explode(p.tags) exploded_tags_table AS single_tag;
  1. 查看 sales_details_expanded_view 的创建语句:
SHOW CREATE TABLE sales_details_expanded_view;
  1. 创建 customer_purchase_channels_view:
CREATE VIEW customer_purchase_channels_view AS
SELECT
c.customer_name,
details.detail_value AS purchase_channel
FROM
customers c
JOIN
sales s ON c.customer_id = s.customer_id
LATERAL VIEW explode(s.sale_details) details_table AS detail_key, detail_value
WHERE details.detail_key = 'channel';
  1. 删除 product_basic_info_view:
DROP VIEW IF EXISTS product_basic_info_view;

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

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

相关文章

微软开源GraphRAG的使用教程-使用自定义数据测试GraphRAG

微软在今年4月份的时候提出了GraphRAG的概念,然后在上周开源了GraphRAG,Github链接见https://github.com/microsoft/graphrag,截止当前,已有6900+Star。 安装教程 官方推荐使用Python3.10-3.12版本,我使用Python3.10版本安装时,在初始化项目过程中会报错,切换到Python3.…

XXX企业云桌面系统建设技术方案书——基于超融合架构的安全高效云办公平台设计与实施

目录 1. 项目背景与目标1.1 背景分析1.2 建设目标2. 需求分析2.1 功能需求用户规模与场景终端兼容性2.2 非功能需求3. 系统架构设计3.1 总体架构图流程图说明3.2 技术选型对比3.3 网络设计带宽规划公式4. 详细实施方案4.1 分阶段部署计划4.2 桌面模板配置4.3 测试方案性能测试工…

数据直观分析与可视化

数据直观分析与可视化 一、数据的直观分析核心价值 数据的直观分析旨在通过视觉化的方式&#xff0c;帮助人们更直观、更快速地理解数据的特征和模式&#xff0c;从而发现趋势、异常值、分布情况以及变量之间的关系&#xff0c;为决策提供支持。 数据可视化与信息图形、信息可…

Neo4j数据库

Neo4j 是一款专门用来处理复杂关系的数据库。我们可以简单地将它理解为一个“用图结构来管理数据的工具”。与我们常见的&#xff0c;像 Excel 那样用表格&#xff08;行和列&#xff09;来存储数据的传统数据库不同&#xff0c;Neo4j 采用了一种更接近人类思维对现实世界理解的…

Java异常处理全解析:从基础到自定义

目录 &#x1f680;前言&#x1f914;异常的定义与分类&#x1f4af;运行时异常&#x1f4af;编译时异常&#x1f4af;异常的基本处理 &#x1f31f;异常的作用&#x1f427;自定义异常&#x1f4af;自定义运行时异常&#x1f4af;自定义编译时异常 ✍️异常的处理方案&#x1…

Redisson分布式集合原理及应用

Redisson是一个用于Redis的Java客户端&#xff0c;它简化了复杂的数据结构和分布式服务的使用。 适用场景对比 数据结构适用场景优点RList消息队列、任务队列、历史记录分布式共享、阻塞操作、分页查询RMap缓存、配置中心、键值关联数据支持键值对、分布式事务、TTLRSet去重集…

打破次元壁,VR 气象站开启气象学习新姿势​

在教育领域&#xff0c;VR 气象站同样发挥着巨大的作用&#xff0c;为气象教学带来了全新的模式&#xff0c;打破了传统教学的次元壁&#xff0c;让学生们以全新的姿势学习气象知识。​ 在传统的气象教学中&#xff0c;学生们主要通过课本、图片和老师的讲解来学习气象知识。这…

k8s面试题-ingress

场景&#xff1a;我通过deployment更新pod&#xff0c;ingress是怎么把新的请求流量发送到我新的pod的&#xff1f;是怎么监控到我更新的pod的&#xff1f; 在 Kubernetes 中&#xff0c;Ingress 是一种 API 对象&#xff0c;用于管理外部访问到集群内服务的 HTTP 和 HTTPS 路…

RHCE 练习三:架设一台 NFS 服务器

一、题目要求 1、开放 /nfs/shared 目录&#xff0c;供所有用户查询资料 2、开放 /nfs/upload 目录&#xff0c;为 192.168.xxx.0/24 网段主机可以上传目录&#xff0c;并将所有用户及所属的组映射为 nfs-upload,其 UID 和 GID 均为 210 3.将 /home/tom 目录仅共享给 192.16…

【动态导通电阻】GaN HEMT动态导通电阻的精确测量

2023 年 7 月,瑞士洛桑联邦理工学院的 Hongkeng Zhu 和 Elison Matioli 在《IEEE Transactions on Power Electronics》期刊发表了题为《Accurate Measurement of Dynamic ON-Resistance in GaN Transistors at Steady-State》的文章,基于提出的稳态测量方法,研究了氮化镓(…

AI 制作游戏美术素材流程分享(程序员方向粗糙版)

AI 制作游戏美术素材分享(程序员方向粗糙版) 视频讲解: 抖音:https://www.douyin.com/user/self?from_tab_namemain&modal_id7505691614690561295&showTabpost Bilibili: https://www.bilibili.com/video/BV1ojJGzZEve/ 写在最前面: 本方法比较粗糙,只对对美术风…

Java求职面试:互联网大厂技术栈深度解析

文章简述 在这篇文章中&#xff0c;我们将通过一个模拟的面试场景&#xff0c;带你深入了解Java求职面试中可能会遇到的技术栈问题。通过这个故事&#xff0c;你可以学习到相关技术点的具体应用场景和面试技巧。 正文 场景&#xff1a;某互联网大厂的面试现场 面试官&#…

学习日记-day11-5.20

完成目标&#xff1a; comment.java package com.zcr.pojo; import org.hibernate.annotations.GenericGenerator;import javax.persistence.*; //JPA操作表中数据&#xff0c;可以将对应的实体类映射到一张表上Entity(name "t_comment")//表示当前的实体类与哪张表…

机器学习第十九讲:交叉验证 → 用五次模拟考试验证真实水平

机器学习第十九讲&#xff1a;交叉验证 → 用五次模拟考试验证真实水平 资料取自《零基础学机器学习》。 查看总目录&#xff1a;学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章&#xff1a;DeepSeek R1本地与线上满血版部署&#xff1a;超详细手把手指南 交叉验证…

Linux面试题集合(6)

创建多级目录或者同级目录 mkdir -p 文件名/文件名/文件名 mkdir -p 文件名 文件名 文件名 Linux创建一个文件 touch 文件名 DOS命令创建文件 echo 内容>文件名&#xff08;创建一个有内容的文件&#xff09; echo >文件名&#xff08;创建一个没有内容的文件&#xff09…

Vue百日学习计划Day46-48天详细计划-Gemini版

Day 46: <KeepAlive> - 组件缓存与优化 (~3 小时) 本日目标: 理解 <KeepAlive> 的作用&#xff0c;学会如何使用它来缓存组件实例&#xff0c;从而优化应用性能和用户体验。所需资源: Vue 3 官方文档 (<KeepAlive>): https://cn.vuejs.org/guide/built-ins/…

SpringBean模块(三)具有生命周期管理能力的类(1)AutowireCapableBeanFactory

一、介绍 1、简介 AutowireCapableBeanFactory 是 Spring 框架中的一个接口&#xff0c;位于 org.springframework.beans.factory 包下&#xff0c;它提供了更底层的 Bean 实例化、依赖注入和生命周期管理能力&#xff0c;即使这些 Bean 没有通过常规的 Component 或 XML 注册…

Service Mesh

目录 一、Service Mesh 的核心特点 二、Service Mesh 的典型架构 1. Sidecar 模式 2. 控制平面与数据平面分离 三、Service Mesh 解决的核心问题 四、典型应用场景 五、主流 Service Mesh 框架对比 六、挑战与局限性 七、未来趋势 总结 Istio 一、Istio 核心组件与…

黑马Java基础笔记-13常用查找算法

查找算法 基本查找(也叫顺序查找&#xff0c;线性查找) 二分查找&#xff08;需要有序数据&#xff09; public static int binarySearch(int[] arr, int number){//1.定义两个变量记录要查找的范围int min 0;int max arr.length - 1;//2.利用循环不断的去找要查找的数据wh…

Go 语言 vs C+Lua(Skynet)游戏服务器方案对比分析

为啥挑这两个呢&#xff1f;因为两种技术分别对应CSP模型和Actor模型&#xff0c;都是经过时间检验的成熟且可靠的并发模型&#xff0c;问了很多地方&#xff0c;经过gpt整理得出如下报告。 从开发效率、运行性能、热更新扩展、云部署与水平扩展能力、多类型游戏支持等五个维度…