七、深入 Hive DDL:管理表、分區與洞察元數據

作者:IvanCodes
日期:2025年5月13日
專欄:Hive教程

內容導航

      • 一、表的 DDL 操作 (非創建)
      • 二、分區的 DDL 操作
      • 三、洞察元數據:SHOW 命令的威力
      • 結語:DDL 與 SHOW,Hive 管理的雙翼
      • 練習題
        • 一、選擇題
        • 二、代碼題
      • 練習題答案
        • 一、選擇題答案
        • 二、代碼題答案

在 Apache Hive 中,數據定義語言 (DDL) 不僅僅局限于創建表 (CREATE TABLE)。為了有效地管理和維護數據倉庫中的數據結構,Hive 提供了一系列豐富的 DDL 命令來修改表屬性、管理分區以及查看元數據信息。本文將重點介紹這些核心的 DDL 操作常用的 SHOW 命令,幫助您更自如地駕馭 Hive。

一、表的 DDL 操作 (非創建)

一旦表被創建,我們經常需要對其結構或屬性進行調整

  1. ALTER TABLE ... RENAME TO:重命名表
    用于修改現有表的名稱。
    語法:
ALTER TABLE old_table_name RENAME TO new_table_name;

案例:

ALTER TABLE user_logs RENAME TO application_logs;
  1. ALTER TABLE ... ADD COLUMNS:添加列
    向表中添加新的列。新添加的列會出現在現有列之后,或者如果表有分區,會出現在非分區列的末尾,分區列之前。
    語法:
ALTER TABLE table_name ADD COLUMNS (new_col1_name data_type [COMMENT 'comment'], new_col2_name data_type [COMMENT 'comment'], ...);

案例:

ALTER TABLE application_logs ADD COLUMNS (ip_address STRING COMMENT 'User IP address', browser_info STRING);
  1. ALTER TABLE ... CHANGE COLUMN:修改列
    可以修改列的名稱、數據類型、注釋以及在表中的位置。這是一個非常靈活但也需要謹慎使用的操作,特別是修改數據類型時,需要考慮數據兼容性。
    語法:
ALTER TABLE table_name CHANGE COLUMN old_col_name new_col_name new_data_type [COMMENT 'comment'] [FIRST | AFTER existing_col_name];

案例:將 browser_info 列重命名為 client_agent 并移動到 ip_address 列之后

ALTER TABLE application_logs CHANGE COLUMN browser_info client_agent STRING COMMENT 'Client user agent' AFTER ip_address;
  1. ALTER TABLE ... REPLACE COLUMNS:替換所有列
    此操作會移除表中所有現有的非分區列,并用指定的新列集合替換它們。這是一個具有破壞性的操作。
    語法:
ALTER TABLE table_name REPLACE COLUMNS (new_col1_name data_type [COMMENT 'comment'], ...);

案例:(謹慎使用)

-- 假設要完全重構 product_details 表的列
-- ALTER TABLE product_details REPLACE COLUMNS (item_id INT, item_name STRING, price DECIMAL(8,2));
  1. ALTER TABLE ... SET TBLPROPERTIES:設置表屬性
    用于添加或修改表的元數據屬性,例如注釋、是否為外部表(雖然通常在創建時定義)等。
    語法:
ALTER TABLE table_name SET TBLPROPERTIES ('property_name' = 'property_value', ...);

案例:給表添加一個描述性注釋

ALTER TABLE application_logs SET TBLPROPERTIES ('comment' = 'System application access logs.');
  1. DROP TABLE:刪除表
    用于刪除一個已存在的表。對于內部表,會同時刪除元數據和 HDFS 上的數據;對于外部表,僅刪除元數據。
    語法:
DROP TABLE [IF EXISTS] table_name [PURGE];
  • IF EXISTS:如果表不存在,命令不會報錯。
  • PURGE:刪除表時,數據不會進入 HDFS 回收站(如果啟用了回收站)。
    案例:刪除一個名為 old_temp_data 的表,如果它存在的話
DROP TABLE IF EXISTS old_temp_data;
  1. TRUNCATE TABLE:清空表數據
    刪除表中的所有行,但保留表結構和元數據。對于分區表,可以指定清空特定分區的數據。
    語法:
TRUNCATE TABLE table_name [PARTITION (partition_spec)];

案例:清空 staging_area 表的所有數據

TRUNCATE TABLE staging_area;

二、分區的 DDL 操作

分區是 Hive 中重要的性能優化手段

  1. ALTER TABLE ... ADD PARTITION:添加分區
    為一個已存在的分區表添加新的分區。可以同時指定分區的存儲位置。
    語法:
ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION (partition_col1=val1, partition_col2=val2, ...) [LOCATION 'hdfs_path_to_partition_data']
[PARTITION (partition_col1=val3, partition_col2=val4, ...) [LOCATION '...'] ...];

案例:為 application_logs 表(假設按 dtcountry 分區)添加一個新分區

-- 假設 application_logs 表已按 (dt STRING, country STRING) 分區
ALTER TABLE application_logs ADD IF NOT EXISTS PARTITION (dt='2023-11-15', country='US') LOCATION '/data/logs/app/2023-11-15/US';
  1. ALTER TABLE ... DROP PARTITION:刪除分區
    從分區表中刪除一個或多個分區。與 DROP TABLE 類似,對于內部表的分區,會刪除元數據和數據;對于外部表的分區,通常只刪除元數據(行為可能受 Hive 版本和配置影響)。
    語法:
ALTER TABLE table_name DROP [IF EXISTS] PARTITION (partition_col1=val1, ...), PARTITION (partition_col1=val2, ...) [PURGE];

案例:刪除 application_logs 表的特定分區

ALTER TABLE application_logs DROP IF EXISTS PARTITION (dt='2023-01-01', country='CA');
  1. ALTER TABLE ... RENAME PARTITION:重命名分區(較新版本支持)
    修改一個現有分區的分區鍵值。這在需要更正錯誤的分區值或調整分區策略時很有用。
    語法:
ALTER TABLE table_name PARTITION (partition_col1=old_val1, ...) RENAME TO PARTITION (partition_col1=new_val1, ...);

案例:將分區 dt='2023-OCT' 重命名為 dt='2023-10'

-- 假設表 sales_monthly 按 (dt STRING) 分區
ALTER TABLE sales_monthly PARTITION (dt='2023-OCT') RENAME TO PARTITION (dt='2023-10');
  1. ALTER TABLE ... EXCHANGE PARTITION:交換分區(高級操作)
    允許在兩個具有相同表結構(列定義、文件格式等)的表之間原子地交換一個或多個分區的數據和元數據。常用于數據加載和發布的場景。
    語法:
ALTER TABLE table_A EXCHANGE PARTITION (partition_spec) WITH TABLE table_B;

案例:將 staging_table 的一個分區數據交換到 production_table

-- 假設 staging_table 和 production_table 結構相同且都按 (load_date DATE) 分區
ALTER TABLE production_table EXCHANGE PARTITION (load_date='2023-11-16') WITH TABLE staging_table;

三、洞察元數據:SHOW 命令的威力

SHOW 命令是查看 Hive 元數據信息必備工具

  1. SHOW DATABASESSHOW SCHEMAS:列出所有數據庫
    語法:
SHOW DATABASES;
SHOW SCHEMAS;
SHOW DATABASES LIKE 'pattern*'; -- 支持通配符

案例:

SHOW DATABASES;
SHOW DATABASES LIKE 'prod_*';
  1. SHOW TABLES [IN database_name]:列出數據庫中的表
    語法:
SHOW TABLES; -- 列出當前數據庫的表
SHOW TABLES IN my_database;
SHOW TABLES LIKE '*_logs'; -- 支持通配符

案例:

USE default;
SHOW TABLES;
SHOW TABLES IN staging_db LIKE 'temp_*';
  1. SHOW PARTITIONS table_name [PARTITION(partition_spec)]:列出表的分區
    語法:
SHOW PARTITIONS table_name;
SHOW PARTITIONS table_name PARTITION(country='US'); -- 列出指定分區下的子分區(如果有多級分區)

案例:

SHOW PARTITIONS application_logs;
SHOW PARTITIONS application_logs PARTITION(dt='2023-11-15');
  1. SHOW COLUMNS FROM table_nameDESCRIBE table_name:顯示表的列信息
    語法:
SHOW COLUMNS FROM table_name;
DESCRIBE table_name;

案例:

DESCRIBE application_logs;
  1. DESCRIBE FORMATTED table_nameDESCRIBE EXTENDED table_name:顯示詳細的表元數據
    提供比 DESCRIBE 更全面的信息,包括存儲信息、分區鍵、表屬性等。
    語法:
DESCRIBE FORMATTED table_name;
DESCRIBE EXTENDED table_name;

案例:

DESCRIBE FORMATTED application_logs;
  1. SHOW CREATE TABLE table_name:顯示創建表的 DDL 語句
    這對于復制表結構或理解表是如何創建的非常有用。
    語法:
SHOW CREATE TABLE table_name;

案例:

SHOW CREATE TABLE application_logs;
  1. SHOW TBLPROPERTIES table_name [('property_name')]:顯示表的屬性
    語法:
SHOW TBLPROPERTIES table_name;
SHOW TBLPROPERTIES table_name ('comment'); -- 顯示特定屬性的值

案例:

SHOW TBLPROPERTIES application_logs;
SHOW TBLPROPERTIES application_logs ('comment');

結語:DDL 與 SHOW,Hive 管理的雙翼

熟練運用 Hive 的各類 DDL 操作SHOW 命令,是高效管理 Hive 數據倉庫、優化查詢性能以及排查問題基礎。從調整表結構精細化管理分區,再到深入洞察元數據,這些
命令共同構成數據工程師與 Hive 交互的日常語言。通過不斷的實踐,您將更加得心應手駕馭這個強大的數據工具

在這里插入圖片描述
在這里插入圖片描述


練習題

一、選擇題
  1. 以下哪個命令用于將 Hive 表 old_log 重命名為 archived_log
    A. RENAME TABLE old_log TO archived_log;
    B. ALTER TABLE old_log RENAME TO archived_log;
    C. MODIFY TABLE old_log NAME archived_log;
    D. UPDATE TABLE old_log SET NAME = archived_log;

  2. 要查看表 employees 的詳細元數據信息,包括存儲格式和表屬性,應使用哪個命令?
    A. SHOW TABLE employees;
    B. DESCRIBE employees;
    C. SHOW CREATE TABLE employees;
    D. DESCRIBE FORMATTED employees;

  3. 哪個命令用于從分區表 daily_sales 中刪除 dt='2023-01-15' 這個分區?
    A. DELETE PARTITION (dt='2023-01-15') FROM daily_sales;
    B. DROP PARTITION daily_sales (dt='2023-01-15');
    C. ALTER TABLE daily_sales DROP PARTITION (dt='2023-01-15');
    D. TRUNCATE TABLE daily_sales PARTITION (dt='2023-01-15');

二、代碼題
  1. 場景:你有一個名為 customer_profiles 的表,當前包含列 customer_id INT, name STRING, email STRING
    要求

    • 向該表添加一個新的列 phone_number STRING,并添加注釋 ‘Customer contact phone number’。
    • 修改 email 列的名稱為 email_address,并將其數據類型更改為 STRING(假設它已經是STRING,這里僅演示改名)。

    請編寫完成上述操作的 HQL 語句。

  2. 場景:你有一個按 log_date DATEevent_type STRING 分區的表 event_stream
    要求

    • 列出 event_stream 表中所有 log_date 為 ‘2023-11-16’ 的分區。
    • 顯示 event_stream 表的完整創建 DDL 語句。

    請編寫完成上述操作的 HQL 語句。


練習題答案

一、選擇題答案
  1. B. ALTER TABLE old_log RENAME TO archived_log;
  2. D. DESCRIBE FORMATTED employees;
  3. C. ALTER TABLE daily_sales DROP PARTITION (dt='2023-01-15');
二、代碼題答案
  1. 修改 customer_profiles 表結構:
-- 添加新列
ALTER TABLE customer_profiles ADD COLUMNS (phone_number STRING COMMENT 'Customer contact phone number');-- 修改列名(和類型,如果需要的話)
ALTER TABLE customer_profiles CHANGE COLUMN email email_address STRING;
  1. 查看 event_stream 表信息:
-- 列出特定分區下的子分區 (這里假設 event_type 是子分區)
SHOW PARTITIONS event_stream PARTITION(log_date='2023-11-16');-- 顯示表的創建DDL
SHOW CREATE TABLE event_stream;

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

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

相關文章

【 Redis | 實戰篇 短信登錄 】

前言: 主要完成了基于Session實現登錄,解決集群的Session共享問題,從而實現了基于Redis來實現共享Session登錄 1.基于Session實現登錄 1.1.發送短信驗證碼 步驟: 前端提交手機號 》校驗手機號 》不符合返回錯誤信息&#xff0…

藍橋杯14屆國賽 合并數列

問題描述 小明發現有很多方案可以把一個很大的正整數拆成若干正整數的和。他采取了其中兩種方案,分別將他們列為兩個數組 {a1,a2,...,an} 和 {b1,b2,...,bm}。兩個數組的和相同。 定義一次合并操作可以將某數組內相鄰的兩個數合并為一個新數,新數的值是…

Doris和Clickhouse對比

目錄 一、Doris和Clickhouse對比1. 底層架構**DorisClickHouse** 2. 運行原理DorisClickHouse 3. 使用場景DorisClickHouse 4. 優缺點對比總結 二、MPP架構和Shared-Nothing 架構對比1. 什么是 MPP 架構?定義特點典型代表 2. 什么是 Shared-Nothing 架構&#xff1f…

niushop單商戶V5多門店版V5.5.0全插件+商品稱重、商家手機端+搭建環境教程

一.系統介紹 【全開源】niushop單商戶V5多門店版V5.5.0版本,我看很多人都想要 商品稱重、商家手機端等插件這套是全插件版本,整合起來本博主也花了不少啦~ Niushop系統是應用thinkphp6開發的完善的電商系統,擁有完善的商品機制,…

內存、磁盤、CPU區別,Hadoop/Spark與哪個聯系密切

1. 內存、磁盤、CPU的區別和作用 1.1 內存(Memory) 作用: 內存是計算機的短期存儲器,用于存儲正在運行的程序和數據。它的訪問速度非常快,比磁盤快幾個數量級。在分布式計算中,內存用于緩存中間結果、存儲…

Jenkins linux安裝

jenkins啟動 service jenkins start 重啟 service jenkins restart 停止 service jenkins stop jenkins安裝 命令切換到自己的下載目錄 直接用命令下載 wget http://pkg.jenkins-ci.org/redhat-stable/jenkins-2.190.3-1.1.noarch.rpm 下載直接安裝 rpm -ivh jenkins-2.190.3-…

RabbitMQ ②-工作模式

RabbitMQ 工作模式 官方提供了七種工作模式 Simple(簡單模式) P:生產者,發布消息到隊列C:消費者,從隊列中獲取消息并消費Queue:消息隊列,存儲消息。 一個生產者,一個…

(2)python開發經驗

文章目錄 1 pyside6加載ui文件2 使用pyinstaller打包 更多精彩內容👉內容導航 👈👉Qt開發 👈👉python開發 👈 1 pyside6加載ui文件 方法1: 直接加載ui文件 from PySide6.QtWidgets import QAp…

【C++】互斥鎖(Mutex)

在C中,互斥鎖(Mutex)是用于線程同步的重要工具,用于保護共享資源,防止多線程同時訪問導致的數據競爭(Data Race)問題。 以下是C中互斥鎖的核心用法和示例: 一、基本互斥鎖 std::mut…

Jsoup與HtmlUnit:兩大Java爬蟲工具對比解析

Jsoup:HTML解析利器 定位:專注HTML解析的輕量級庫(也就是快,但動態頁面無法抓取) 核心能力: DOM樹解析與CSS選擇器查詢 HTML凈化與格式化 支持元素遍歷與屬性提取 應用場景:靜態頁面數據抽…

小白成長之路-vim編輯

文章目錄 Vim一、命令模式二、插入模式3.a:進入插入模式,在當前光標的后一個字符插入![在這里插入圖片描述](https://i-blog.csdnimg.cn/direct/fd293c3832ed49e2974abfbb63eeb5bb.png)4.o: 在當前光標的下一行插入5.i:在當前光標所在字符插入,返回命令模…

[redis進階六]詳解redis作為緩存分布式鎖

目錄 一 什么是緩存 緩存總結板書: 二 使?Redis作為緩存 三 緩存的更新策略 1) 定期?成 2) 實時?成 四 面試重點:緩存預熱,緩存穿透,緩存雪崩 和緩存擊穿 1)緩存預熱 2)緩存穿透 3)緩存雪崩 4)緩存擊穿 五 分布式鎖 板書: 1)什么是分布式鎖 2)分布式鎖的基…

【MySQL】數據表插入數據

個人主頁:Guiat 歸屬專欄:MySQL 文章目錄 1. 插入數據概述1.1 插入數據的重要性1.2 插入數據的基本原則 2. 基本插入語句2.1 INSERT INTO語法2.2 插入多行數據2.3 不指定列名的插入2.4 插入NULL和默認值 3. 高級插入技術3.1 使用子查詢插入數據3.2 IGNOR…

軟考-軟件設計師中級備考 14、刷題 算法

一、考點歸納 1)排序 2、查找 3、復雜度 4、經典問題 0 - 1 背包動態規劃0 - 1 背包問題具有最優子結構性質和重疊子問題性質。通過動態規劃可以利用一個二維數組來記錄子問題的解,避免重復計算,從而高效地求解出背包能裝下的最大價值。分…

【阿里云】阿里云 Ubuntu 服務器無法更新 systemd(Operation not permitted)的解決方法

零、前言 目前正在使用的Ubuntu服務器中,僅阿里云(不止一臺)出現了這個問題,因此我判定是阿里云服務器獨有的問題。如果你的服務器提供商不是阿里云,那么這篇文章可能對你沒有幫助。 如果已經因為升級錯誤導致依賴沖突…

css 點擊后改變樣式

背景: 期望實現效果:鼠標點擊之后,保持選中樣式。 實現思路:在css樣式中,:active 是一種偽類,用于表示用戶當前正在與被選定的元素進行交互。當用戶點擊或按住鼠標時,元素將被激活,此…

采用AI神經網絡降噪算法的語言降噪消回音處理芯片NR2049-P

隨著AI時代來臨.通話設備的環境噪音抑制也進入AI降噪算法時代. AI神經網絡降噪技術是一款革命性的語音處理技術,他突破了傳統單麥克風和雙麥克風降噪的局限性,利用采集的各種日常環境中的噪音樣本進行訓練學習.讓降噪算法具有自適應噪聲抑制功能,可以根…

不用聯網不用編程,PLC通過智能網關快速實現HTTP協議JSON格式與MES等系統平臺雙向數據通訊

智能網關IGT-DSER集成了多種PLC的原廠協議,方便實現各種PLC、智能儀表通過HTTP協議與MES等各種系統平臺通訊對接。PLC內不用編寫程序,設備不用停機,通過網關的參數配置軟件(下載地址)配置JSON文件的字段與PLC寄存器地址等參數即可。 …

如何將兩臺虛擬機進行搭橋

將兩臺虛擬機實現網絡互通(“搭橋”)需配置虛擬網絡,以下是基于 VMware Workstation 和 VirtualBox 的詳細操作指南(以 Windows 系統為例,Linux 原理類似): 一、VMware Workstation 配置&#x…

Xianyu AutoAgent,AI閑魚客服機器人

Xianyu AutoAgent是一款專為閑魚平臺開發的智能客服機器人系統,旨在提供全天候的自動化服務。它具備多專家協同決策、智能議價和上下文感知對話等功能,能夠管理輕量級的對話記憶,利用完整的對話歷史為用戶提供更自然的交流體驗。 Xianyu Aut…