七、深入 Hive DDL:管理表、分区与洞察元数据

news2025/5/15 2:02:42

作者: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.coloradmin.cn/o/2375740.html

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

相关文章

直接在Excel中用Python Matplotlib/Seaborn/Plotly......

本次分享如何利用pyxll包,实现直接在Excel中使用Python Matplotlib/Seaborn/Plotly等强大可视化工具。 pyxll配置 pyxll安装 pip install pyxll pyxll install pyxll自定义方法 例如,自定义一个计算斐波那契数的方法fib,并使用pyxll装饰器…

React面试常问问题详解

以下是30个React面试中常见的问题及简要解析,涵盖基础概念、核心原理、性能优化、Hooks、状态管理等方面,适用于初中高级开发者准备面试时参考: 一、React 基础与核心概念 React 是什么? React 是由 Facebook 开发的用于构建用户界…

【Java】网络编程(Socket)

网络编程 Socket 我们开发的网络应用程序位于应用层,TCP和UDP属于传输层协议,在应用层如何使用传输层的服务呢?在应用层和传输层之间,则使用套接字Socket来进行分离 套接字就像是传输层为应用层开的一个小口,应用程…

思科(Cisco ASA/Firepower)、华三(H3C)、华为(Huawei USG)防火墙 的基础配置

以下是针对 思科(Cisco ASA/Firepower)、华三(H3C)、华为(Huawei USG)防火墙 的基础配置指南,涵盖 区域划分、安全策略、NAT、路由 等核心功能。配置示例基于通用场景,实际部署时需根…

Windows环境下maven的安装与配置

1.检查JAVA_HOME环境变量 Maven是使用java开发的,所以必须知道当前系统环境中的JDK的安装目录。 搜索栏直接输入“cmd” 或者 WinR 输入cmd 在打开的终端窗口输入“echo %JAVA_HOME”,就可以看到jdk的位置了。 如果没有的话,请参考我的文章&a…

LeetCode:513、找树左下角的值

//递归法 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* t…

Vxe UI vue vxe-table 实现表格数据分组功能,不是使用树结构,直接数据分组

Vxe UI vue vxe-table 实现表格数据分组功能,不是使用树结构,直接数据分组 查看官网:https://vxetable.cn gitbub:https://github.com/x-extends/vxe-table gitee:https://gitee.com/x-extends/vxe-table 代码 通过…

如何禁止chrome自动更新

百度了一下 下面这个方法实测有效 目录 1、WINR 输入 services.msc 2、在Services弹窗中找到下面两个service并disable 3、验证是否禁止更新成功: 1、WINR 输入 services.msc 2、在Services弹窗中找到下面两个service并disable GoogleUpdater InternalService…

阳光学院【2020下】计算机网络原理-A卷-试卷-期末考试试卷

一、单选题(共25分,每空1分) 1.ICMP协议工作在TCP/IP参考模型的 ( ) A.主机-网络 B.网络互联层 C.传输层 D.应用层 2.下列关于交换技术的说法中,错误的是 ( ) A.电路交换适用于突发式通信 B.报文交换不能满足实时通信 C.报文…

kotlin-协程(什么是一个协程)

1.什么指一个协程对于线程来说一个thread就是就是指一个线程,thread为什么成为线程呢?因为他实现了对线程的一个抽象管理,可以管理这个线程,启动,可以查看各种信息 那么协程呢? public fun CoroutineScop…

数组和切片的区别

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

WPF内嵌其他进程的窗口

WPF内嵌其他进程窗口的常见方法有 HwndHost SetParent 和 WindowsFormsHost WinForms Panel SetParent 推荐使用自定义HwndHost 两者的对比区别 示例代码 public class MyWndHost : HwndHost {const int WS_CHILD 0x40000000;const int WS_VISIBLE 0x10000000;const i…

CVPR2025 | Prompt-CAM: 让视觉 Transformer 可解释以进行细粒度分析

Prompt-CAM: Making Vision Transformers Interpretable for Fine-Grained Analysis 摘要-Abstract引言-Introduction方法-Approach预备知识-PreliminariesPrompt-CAM: Prompt Class Attention Map特征识别与定位-Trait Identification and Localization变体与扩展-Variants an…

解锁 DevOps 新境界 :使用 Flux 进行 GitOps 现场演示 – 自动化您的 Kubernetes 部署

前言 GitOps 是实现持续部署的云原生方式。它的名字来源于标准且占主导地位的版本控制系统 Git。GitOps 的 Git 在某种程度上类似于 Kubernetes 的 etcd,但更进一步,因为 etcd 本身不保存版本历史记录。毋庸置疑,任何源代码管理服务&#xf…

LLM大模型中的基础数学工具—— 信号处理与傅里叶分析

Q51: 推导傅里叶变换 的 Parseval 定理 傅里叶变换的 Parseval 定理揭示了啥关系? Parseval 定理揭示了傅里叶变换中时域与频域的能量守恒关系,即信号在时域的总能量等于其在频域的总能量。这就好比一个物体无论从哪个角度称重,重量始终不…

橡胶制品行业质检管理的痛点 质检LIMS如何重构橡胶制品质检价值链

橡胶制品广泛应用于汽车、医疗、航空等领域,其性能稳定性直接关联终端产品的安全性。从轮胎耐磨性测试到密封件耐腐蚀性验证,每一项检测数据都是企业参与市场竞争的核心筹码。然而,传统实验室管理模式普遍面临设备调度混乱、检测流程追溯断层…

CAElinux系统详解

CAElinux 系统详解:从系统层面到专业应用 一、CAElinux 的定位与核心目标 CAElinux 是一款专门为 计算机辅助工程(CAE) 设计的定制化 Linux 发行版,目标用户为从事工程仿真、数值模拟、高性能计算(HPC)的…

计算机系统----软考中级软件设计师(自用学习笔记)

目录 1、计算机的基本硬件系统 2、CPU的功能 3、运算器的组成 4、控制器 5、计算机的基本单位 6、进制转换问题 7、原码、反码、补码、移码 8、浮点数 9、寻址方式 10、奇偶校验码 11、海明码 12、循环冗余校验码 13、RISC和CISC 14、指令的处理方式 15、存储器…

django的权限角色管理(RBAC)

在 Django 中,User、Group 和 Permission 是权限系统的核心组件。下面通过代码示例演示它们的 CRUD(创建、读取、更新、删除) 操作: 一、User 模型 CRUD from django.contrib.auth.models import User# 创建用户 user User.obje…

线性表-顺序表(Sequential List)

1 线性表 1.1 顺序表(Sequential List) 顺序表并不难理解,主要是知道顺序表是在内存中连续存储的一段数据,知道这个后,相应的算法也就非常简单了。 线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的…