十四、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.pswp.cn/web/80782.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/80782.shtml
英文地址,請注明出處:http://en.pswp.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整理得出如下報告。 從開發效率、運行性能、熱更新擴展、云部署與水平擴展能力、多類型游戲支持等五個維度…