五、Hive表類型、分區及數據加載

在 Hive 中高效構建、管理和查詢數據倉庫,核心在于精準運用表類型(內部/外部)分區策略(靜態/動態/多重)。這不僅決定數據的生命周期歸屬,更是優化海量數據查詢性能關鍵手段

一、表的身份權責:內部表 vs 外部表

內部表 (Managed Table)

  • 定義: Hive 默認。Hive 同時管理元數據和 HDFS 數據(通常在倉庫目錄創建專屬子目錄)。
  • 數據控制: Hive 擁有并控制數據完整生命周期
  • 生命周期: DROP TABLE 會刪除元數據 HDFS 數據。
  • 適用: 臨時表中間結果,或完全由 Hive 控制的數據。

代碼:創建內部表

CREATE TABLE clicks_internal (session_id STRING,click_url STRING
) 
COMMENT '內部表,數據由Hive管理';

外部表 (External Table)

  • 定義: 需顯式EXTERNAL必須LOCATION 指定 HDFS 路徑。Hive 僅管理元數據
  • 數據控制: Hive 不擁有數據,數據保留LOCATION 原始位置
  • 生命周期: DROP TABLE 僅刪元數據,HDFS 數據保留
  • 適用: 管理已存在數據、需共享數據、防誤刪關鍵數據。

代碼:創建外部表

CREATE EXTERNAL TABLE impressions_external (ad_id STRING,user_id STRING)COMMENT '外部表,數據獨立于Hive'
LOCATION '/data/raw/impressions'; -- 指定數據存儲路徑

關鍵操作:若手動在外部表 LOCATION 路徑下增刪分區目錄,需執行 MSCK REPAIR TABLE table_name; 同步元數據

代碼:修復外部表分區

MSCK REPAIR TABLE impressions_external;

核心對比: DROP TABLE 是否刪 HDFS 數據;Hive 是否移動/擁有數據。

二、查詢加速核心:分區表及其數據加載

分區通過分區鍵大表數據物理劃分到 HDFS 不同子目錄,實現查詢剪枝極大提升性能。

創建分區表

  • 分區鍵不是表中實際存儲的列,但表現如普通列。
  • 支持多重分區,形成層級目錄

代碼:創建單分區表

CREATE TABLE daily_activity (user_id BIGINT,type STRING)
PARTITIONED BY (dt DATE);

代碼:創建多重分區表

CREATE TABLE page_views (user_id BIGINT, page_url STRING)
PARTITIONED BY (view_date DATE, country STRING) -- 按日期和國家分區
STORED AS ORC;

數據加載到分區表

關鍵:必須確保數據被放入正確的分區目錄。Hive 不推薦直接用 hadoop fs -put 到分區目錄(因為這不會更新元數據,除非后續 MSCK REPAIRALTER TABLE ADD PARTITION)。主要有兩種方式:

1. 靜態分區加載

  • 機制: 在加載命令中 明確指定目標分區的所有鍵值。Hive 知道數據確切的目的地。

  • 方式一:LOAD DATA (通常用于加載已準備好的文件到特定分區)

    • LOCAL 關鍵字表示文件在運行 Hive 命令本地機器上(對 HiveServer2 來說是 Server 所在機器)。省略 LOCAL 表示文件在 HDFS 上。
    • OVERWRITE先清空目標分區再加載。省略則追加

    代碼:從本地加載到單分區

    LOAD DATA LOCAL INPATH '/path/to/local/activity_20231103.txt'
    OVERWRITE INTO TABLE daily_activity
    PARTITION (dt='2023-11-03');
    

    代碼:從 HDFS 加載到多重分區

    LOAD DATA INPATH '/user/data/views_us_20231103'
    INTO TABLE page_views
    PARTITION (view_date='2023-11-03', country='US');
    
  • 方式二:INSERT OVERWRITE/INTO ... PARTITION (通常用于從其他表查詢結果并寫入特定分區)

    • INSERT OVERWRITE 覆蓋分區,INSERT INTO 追加(Hive 0.14+)。

    代碼:從源表查詢插入到特定分區

    INSERT OVERWRITE TABLE page_views
    PARTITION (view_date='2023-11-03', country='CA') -- 靜態指定分區
    SELECT user_id, page_url
    FROM source_views
    WHERE event_date = '2023-11-03' AND user_country = 'CA';
    
  • 靜態分區特點: 控制精準;適合分區值已知/固定;分區組合多語句繁瑣

2. 動態分區加載

  • 機制: 僅用于 INSERT ... SELECT。在 PARTITION 子句中不指定(或部分不指定)分區鍵的值,讓 Hive 根據 SELECT 查詢結果對應列必須是最后幾列)的實際值自動推斷創建分區目錄并寫入數據
  • 核心配置:
    • SET hive.exec.dynamic.partition=true; (必須啟用)
    • SET hive.exec.dynamic.partition.mode=nonstrict; (推薦。允許所有分區鍵動態。strict 模式至少需一個靜態鍵,防誤操作)
    • (可選) hive.exec.max.dynamic.partitions... 等參數控制資源
  • SELECT 列順序: 極其重要SELECT 列表中的最后幾列 必須按照 PARTITION 子句中動態分區鍵順序排列,且類型兼容

代碼:全動態分區加載 (單分區鍵)

SET hive.exec.dynamic.partition.mode=nonstrict;
INSERT OVERWRITE TABLE daily_activity
PARTITION (dt) -- dt 是動態分區鍵
SELECT user_id, type, event_date -- event_date 的值將決定 dt 分區值
FROM source_table;

代碼:全動態分區加載 (多重分區鍵)

SET hive.exec.dynamic.partition.mode=nonstrict;
INSERT OVERWRITE TABLE page_views
PARTITION (view_date, country) -- view_date, country 都是動態分區鍵
SELECT user_id, page_url, event_date, user_country -- 最后兩列對應分區鍵
FROM source_views;

代碼:混合分區加載 (多重分區,靜態+動態)

-- 靜態指定 view_date, 動態指定 country
INSERT OVERWRITE TABLE page_views
PARTITION (view_date='2023-11-03', country) -- 靜態在前,動態在后
SELECT user_id, page_url, user_country -- 最后一列對應動態分區鍵 country
FROM source_views
WHERE event_date = '2023-11-03';
  • 動態分區特點: 自動化便捷,尤其適合批量轉換或分區值多樣/未知需小心配置謹防意外產生過多小分區數據傾斜

手動管理分區

  • 除加載外,可直接操作分區元數據。

代碼:手動添加/刪除/修改分區

ALTER TABLE page_views ADD IF NOT EXISTS PARTITION (view_date='2023-11-04', country='CA');
ALTER TABLE page_views DROP IF EXISTS PARTITION (view_date='2023-11-01', country='UK');
ALTER TABLE page_views PARTITION (view_date='2023-11-03', country='US') SET LOCATION 'hdfs:///new/path/...'; -- 修改路徑 (不移動數據)

三、實戰演練與深度思考

練習題 1:
/data/shared_logs 有需長期保留、多部門共享的日志。應創建內部表還是外部表?為何?若手動在 HDFS 增新分區目錄及數據,如何讓 Hive 感知?

練習題 2:
源表 orders_source (含 order_id, user_id, order_amount, order_country, order_date DATE)。創建按國家和日期分區的外部表 orders_partitioned (ORC格式,數據存 /data/orders_part),并寫動態分區導入數據的 INSERT 語句。

練習題 3:
靜態分區 PARTITION 子句的值與源數據列值必須一致嗎?動態分區呢?解釋原因。

練習題 4:
daily_activitydt 分區。SELECT COUNT(*) FROM daily_activity WHERE user_id = 123; 會利用分區提速嗎?為什么?如何設計能讓基于 user_id 的查詢提速?

練習題 5:
解釋 hive.exec.dynamic.partition.mode=strictnonstrict 的區別及 strict 設計意圖。

練習題 6:
如何將內部表 prod_data 無風險轉為外部表?寫 ALTER 語句。

練習題 7 (代碼):
查看 orders_partitioned 表的完整 DDL (創建語句)。

練習題 8 (代碼):
列出 orders_partitioned 表中 order_country='CA' 的所有分區

練習題 9 (代碼):
為分區表 metrics_table (分區鍵 report_date DATE) 批量添加 2023-12-012023-12-05 的分區元數據(假設 HDFS 目錄結構已備好)。

練習題 10 (代碼):
orders_partitioned 表中一次性刪除多個分區:country='JP', date='2023-06-18'country='KR', date='2023-06-19'

練習題 11 (代碼):
寫查詢計算 orders_partitioned 表中 order_country 為 ‘DE’ 或 ‘FR’,且 order_date 在 2023年第三季度的總訂單數。

練習題 12 (代碼):
查看 page_views 表的分區鍵信息。

練習題 13 (代碼):
使用 INSERT OVERWRITE DIRECTORYpage_views特定分區 (date='2023-11-03', country='US') 數據導出到本地目錄 /tmp/exported_data,字段分隔符為 |

練習題 14 (代碼):
假設 daily_activity 表你想按 dttype 進行動態分區,源表 source_table 包含 user_id, activity_type, event_date。寫出正確的 INSERT … SELECT 語句,確保動態分區列順序正確

練習題 15 (代碼):
創建一個內部表 user_profiles,包含 user_id INT, profile MAP<STRING,STRING>,字段分隔符為 ,,Map 鍵值對分隔符為 #,Map 內 KV 分隔符為 :


答案解析

答案 1:
外部表。原因:數據獨立、需共享/保留DROP 安全。執行 MSCK REPAIR TABLE table_name; 同步新分區

答案 2:
DDL:

CREATE EXTERNAL TABLE orders_partitioned (
order_id BIGINT, 
user_id BIGINT, 
order_amount DECIMAL(18,2))
PARTITIONED BY (order_country STRING, order_date DATE) STORED AS ORC
LOCATION '/data/orders_part';

INSERT:

SET hive.exec.dynamic.partition.mode=nonstrict;
INSERT OVERWRITE TABLE orders_partitioned PARTITION (order_country, order_date)
SELECT order_id, user_id, order_amount, order_country, order_date FROM orders_source;

答案 3:

  • 靜態不必。指定值決定目錄。
  • 動態必須。分區值源自 SELECT 列實際值

答案 4:
不會WHERE 未用分區鍵 dt。基于 user_id 提速可考慮分桶 (CLUSTERED BY (user_id) ...)。

答案 5:
strict 要求至少一個靜態分區鍵。意圖防誤操作(如忘加 WHERE)全表掃描海量分區nonstrict 無此限制

答案 6:

ALTER TABLE prod_data SET TBLPROPERTIES('EXTERNAL'='TRUE');

答案 7:

SHOW CREATE TABLE orders_partitioned;

答案 8:

SHOW PARTITIONS orders_partitioned PARTITION(order_country='CA');

答案 9:
標準 HiveQL 不支持日期范圍批量 ADD PARTITION。需腳本循環MSCK REPAIR
腳本思路 (偽代碼):

for day in {01..05}; do
hive -e "ALTER TABLE metrics_table ADD IF NOT EXISTS PARTITION (report_date='2023-12-${day}');"
done

答案 10:
執行多次 ALTER TABLE ... DROP PARTITION

ALTER TABLE orders_partitioned DROP IF EXISTS PARTITION (order_country='JP', order_date='2023-06-18');
ALTER TABLE orders_partitioned DROP IF EXISTS PARTITION (order_country='KR', order_date='2023-06-19');

答案 11:

SELECT COUNT(*) FROM orders_partitioned
WHERE order_country IN ('DE', 'FR')
AND order_date >= '2023-07-01' AND order_date <= '2023-09-30';

答案 12:

DESCRIBE FORMATTED page_views; -- 查看 "# Partition Information"
-- 或
DESCRIBE page_views; -- 分區鍵列在最后

答案 13:

INSERT OVERWRITE LOCAL DIRECTORY '/tmp/exported_data' -- LOCAL 指本地
ROW FORMAT DELIMITED FIELDS TERMINATED BY '|'
SELECT user_id, page_url, view_time -- 選擇需要的列,而不是 *
FROM page_views
WHERE view_date='2023-11-03' AND country='US';

答案 14:
需要創建 daily_activity 表時定義分區鍵為 PARTITIONED BY (dt DATE, type STRING)

SET hive.exec.dynamic.partition.mode=nonstrict;
INSERT OVERWRITE TABLE daily_activity
PARTITION (dt, type) -- dt 和 type 都是動態
SELECT user_id, event_date, activity_type -- 最后兩列 event_date, activity_type 對應分區鍵
FROM source_table;

答案 15:

CREATE TABLE user_profiles (
user_id INT,
profile MAP<STRING,STRING>
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY '#' -- Map 內 KVP 分隔符
MAP KEYS TERMINATED BY ':'; -- Map 內 K 和 V 分隔符

結語:因地制宜,優化存儲與查詢

精準運用 Hive 的表類型分區策略數據倉庫建設性能調優核心。根據數據生命周期、共享需求、查詢模式因素審慎設計,能顯著提升數據管理效率查詢響應

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/82686.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/82686.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/82686.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++色彩博弈的史詩:紅黑樹

文章目錄 1.紅黑樹的概念2.紅黑樹的結構3.紅黑樹的插入4.紅黑樹的刪除5.紅黑樹與AVL樹的比較6.紅黑樹的驗證希望讀者們多多三連支持小編會繼續更新你們的鼓勵就是我前進的動力&#xff01; 紅黑樹是一種自平衡二叉查找樹&#xff0c;每個節點都帶有顏色屬性&#xff0c;顏色或為…

基于STM32、HAL庫的CH342F USB轉UART收發器 驅動程序設計

一、簡介: CH342F是一款USB轉串口芯片,由南京沁恒電子(WCH)生產,具有以下特點: 支持USB轉UART、IrDA紅外或SPI接口 內置時鐘,無需外部晶振 支持5V和3.3V電源電壓 最高支持3Mbps波特率 支持常用的MODEM聯絡信號 內置EEPROM,可配置設備VID/PID/序列號等 二、硬件接口: C…

項目功能-圖片清理(上)

一、圖片存儲介紹 在實際開發中&#xff0c;我們會有很多處理不同功能的服務器。例如&#xff1a; 應用服務器&#xff1a;負責部署我們的應用 數據庫服務器&#xff1a;運行我們的數據庫 文件服務器&#xff1a;負責存儲用戶上傳文件的服務器 分服務器處理的目的是讓服務…

創建三個網絡,分別使用RIP、OSPF、靜態,并每個網絡10個電腦。使用DHCP分配IP

DHCP 自動分配IP&#xff0c;集中管理&#xff0c;提高效率 在路由器中設置 Router>en Router#conf t Router(config)#ip dhcp pool ip30 //創建DHCP地址池 Router(dhcp-config)#network 192.168.30.0 255.255.255.0 // 配置網絡地址和子網掩碼 Router(dhcp-config)#defa…

如何使用 WMIC 命令在 Windows 11 或 10 上卸載軟件

如果您正在尋找一個命令提示符或 PowerShell 命令來卸載 Windows 應用程序,那么使用 wmic(Windows Management Instrumentation Command-line)是一種強大的技術,尤其是在處理難以卸載的程序或自動化卸載過程時。在本教程中,我們將學習如何使用 wmic 來卸載軟件。 先決條件…

FEKO許可證的安全與合規性

在電磁仿真領域&#xff0c;FEKO軟件因其出類拔萃的性能和廣泛的應用場景&#xff0c;贏得了全球用戶的廣泛贊譽。但在這背后&#xff0c;是什么讓FEKO在眾多競爭者中脫穎而出&#xff1f;答案是其許可證的安全與合規性。它們不僅為用戶提供了堅固的保障&#xff0c;更確保了用…

ESP32開發入門(九):HTTP服務器開發實踐

一、HTTP服務器基礎 1.1 什么是HTTP服務器&#xff1f; HTTP服務器是能夠處理HTTP請求并返回響應的網絡服務程序。在物聯網應用中&#xff0c;ESP32可以作為輕量級HTTP服務器&#xff0c;直接接收來自客戶端(如瀏覽器、手機APP)的請求。 1.2 ESP32作為HTTP服務器的特點 輕量…

《棒球百科》MLB棒球公益課·棒球1號位

MLB&#xff08;美國職業棒球大聯盟&#xff09;的棒球公益課通過推廣棒球運動、普及體育教育&#xff0c;對全球多個地區產生了多層次的影響&#xff1a; 1. 體育文化推廣 非傳統棒球地區的普及&#xff1a;在棒球基礎較弱的地區&#xff08;如中國、歐洲部分國家&#xff09…

Baumer工業相機堡盟工業相機的工業視覺是否可以在室外可以做視覺檢測項目

Baumer工業相機堡盟工業相機的工業視覺是否可以在室外可以做視覺檢測項目 Baumer工業相機?視覺檢測項目為什么偏愛“室內環境”&#xff1f;?工業視覺中為什么傾向于室內環境**保障人員與設備安全**&#xff1a;室內環境可以提供更好的安全保障&#xff0c;避免檢測設備和人員…

1. 使用 IntelliJ IDEA 創建 React 項目:創建 React 項目界面詳解;配置 Yarn 為包管理器

1. 使用 IntelliJ IDEA 創建 React 項目&#xff1a;創建 React 項目界面詳解&#xff1b;配置 Yarn 為包管理器 &#x1f9e9; 使用 IntelliJ IDEA 創建 React 項目&#xff08;附 Yarn 配置與 Vite 建議&#xff09;&#x1f4f7; 創建 React 項目界面詳解1?? Name&#xf…

C++GO語言微服務之用戶信息處理②

目錄 01 03-獲取用戶信息-上 02 04-獲取用戶信息-下 03 05-更新用戶名實現 01 06-中間件簡介和中間件類型 02 07-中間件測試和模型分析 03 08-中間件測試案例和小結 04 09-項目使用中間件 01 03-獲取用戶信息-上 ## Cookie操作 ### 設置Cookie go func (c *Context) …

QMK鍵盤固件開發全解析:QMK 固件開發的最新架構和規范(2025最新版)

QMK鍵盤固件開發全解析:QMK 固件開發的最新架構和規范(2025最新版) ?? 前言概述 QMK(Quantum Mechanical Keyboard)作為目前開源鍵盤固件領域的"扛把子",憑借其強大的功能和活躍的社區支持,已經成為眾多DIY鍵盤愛好者的首選開發框架。無論是入門級玩家還是資…

極狐GitLab 容器鏡像倉庫功能介紹

極狐GitLab 是 GitLab 在中國的發行版&#xff0c;關于中文參考文檔和資料有&#xff1a; 極狐GitLab 中文文檔極狐GitLab 中文論壇極狐GitLab 官網 極狐GitLab 容器鏡像庫 (BASIC ALL) 您可以使用集成的容器鏡像庫&#xff0c;來存儲每個極狐GitLab 項目的容器鏡像。 要為您…

Umi+React+Xrender+Hsf項目開發總結

一、菜單路由配置 1.umirc.ts 中的路由配置 .umirc.ts 文件是 UmiJS 框架中的一個配置文件&#xff0c;用于配置應用的全局設置&#xff0c;包括但不限于路由、插件、樣式等。 import { defineConfig } from umi; import config from ./def/config;export default defineCon…

【運維】基于Python打造分布式系統日志聚合與分析利器

《Python OpenCV從菜鳥到高手》帶你進入圖像處理與計算機視覺的大門! 解鎖Python編程的無限可能:《奇妙的Python》帶你漫游代碼世界 在分布式系統中,日志數據分散在多個節點,管理和分析變得復雜。本文詳細介紹如何基于Python開發一個日志聚合與分析工具,結合Logstash和F…

Python實戰:海量獲取京東商品信息

在數據驅動的商業時代&#xff0c;數據就是最寶貴的資源。對于電商從業者、市場分析師而言&#xff0c;從京東這類大型電商平臺獲取商品信息&#xff0c;能夠為市場調研、競品分析、銷售策略制定提供重要依據。今天&#xff0c;就來分享如何用Python實現京東商品信息的海量獲取…

聊一聊常見的超時問題:timeout

大家好&#xff0c;我是G探險者&#xff01; 在日常開發中&#xff0c;“超時&#xff08;Timeout&#xff09;”類錯誤是開發者們經常遇到的問題。無論是調用第三方服務、訪問數據庫&#xff0c;還是并發任務處理&#xff0c;都可能因超時而導致請求失敗或系統異常。 本文將系…

創建型模式:工廠方法(Factory Method)模式

一、簡介 工廠方法(Factory Method)模式是一種創建型設計模式,它定義了一個創建對象的接口,但讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其子類。在 C# 中,工廠方法模式提供了一種更靈活的對象創建方式,將對象的創建和使用分離,提高了代碼的可維護性和…

外網訪問內網海康威視監控視頻的方案:WebRTC + Coturn 搭建

外網訪問內網海康威視監控視頻的方案&#xff1a;WebRTC Coturn 需求背景 在倉庫中有海康威視的監控攝像頭&#xff0c;內網中是可以直接訪問到監控攝像的畫面&#xff0c;由于項目的需求&#xff0c;需要在外網中也能看到監控畫面。 實現這個功能的意義在于遠程操控設備的…

Redis 8.0正式發布,再次開源為哪般?

Redis 8.0 已經于 2025 年 5 月 1 日正式發布&#xff0c;除了一些新功能和性能改進之外&#xff0c;一個非常重要的改變就是新增了開源的 AGPLv3 協議支持&#xff0c;再次回歸開源社區。 為什么說再次呢&#xff1f;這個需要從 2024 年 3 月份 Redis 7.4 說起&#xff0c;因為…