Hive 创建表:内部表、修改表和删除表示例

⚡ 智能摘要

创建、修改和删除ping Apache Hive 中的表使用熟悉的 SQL 风格的 DDL,但结果取决于表是内部表(Hive 拥有的表)还是外部表(仅描述文件)。

  • 🧱 创建表: 一条语句即可定义 Hive 表的列、行格式以及(可选)存储位置。
  • 🏷️ 改变表: RENAME 更改表名,ADD COLUMNS 或 CHANGE COLUMN 编辑架构而不重新加载数据。
  • 🗑️ 删除表: Dropping 内部表删除操作会同时删除架构和数据,而删除操作则会删除数据。ping 外部表仅删除元数据。
  • 🔒 内部所有权归: 内部表或托管表位于仓库目录下,Hive 控制其整个生命周期。
  • 🔗 外部引用: 外部表指向其他工具也会读取的文件,因此这些文件在文件丢失后仍然存在。
  • 🔎 请核对类型: DESCRIBE FORMATTED 报告 MANAGED_TABLE 或 EXTERNAL_TABLE,从而消除删除操作前的任何猜测。

Hive 创建、修改和删除表命令示例

表操作,例如创建、修改和删除ping 本演练将展示 Hive 中的表。每个操作首先以实时会话的形式呈现,然后以可重用语句的形式呈现。

如何在 Hive 中创建、修改和删除表

在下面的屏幕截图中,我们正在创建一个带有列的表并更改表名。

  1. 创建名为 guru_sample 的表,其中包含两个列,列名分别为“empid”和“empname”。
  2. 显示 guru99 数据库中存在的表格
  3. guru_sample 显示在表格下方
  4. 将表“guru_sample”更改为“guru_sampleNew”
  5. 同样,当你执行“show”命令时,它会显示新名称guru_sampleNew。

下面的步骤将按顺序运行所有五个步骤。 蜂巢> 提示,并且在重命名前后各调用一次 SHOW TABLES,使效果可见。

Hive 会话创建 guru_sample 并将其重命名为 guru_sampleNew

Dropping 表 guru_sampleNew:

一条 DROP TABLE 语句即可删除重命名的表,Hive 会返回 OK。

蜂巢外壳掉落ping guru_sampleNew 表返回 OK 响应

Hive CREATE TABLE 语法和常用子句

上面的例子使用了最短的形式。文档中描述的语句接受几个可选子句,每个子句都会决定示例中保留的某些内容。

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
  [(col_name data_type [COMMENT col_comment], ...)]
  [COMMENT table_comment]
  [PARTITIONED BY (col_name data_type, ...)]
  [CLUSTERED BY (col_name, ...) INTO num_buckets BUCKETS]
  [ROW FORMAT row_format]
  [STORED AS file_format]
  [LOCATION hdfs_path]
  [TBLPROPERTIES (property_name=property_value, ...)];
条款 它控制什么
外部 创建一个外部表,因此 DROP 操作不会删除数据文件。
临时 创建一个会话范围的表,该表在会话结束时消失。
如果不存在 当同名表已存在时,抑制错误。
分区 将表拆分为每个键值一个目录
按…聚类成 n 个桶 将行哈希到固定数量的文件中
行格式/存储方式 设置分隔符或序列化/反序列化器 (SerDe) 以及文件格式,例如 TEXTFILE、ORC 或 Parquet。
位置 将表指向特定的 HDFS 路径,而不是仓库的默认路径。
TBLPROPERTIES 附加元数据键值对,包括 external.table.purge

相关形式, 创建表 new_table,类型与 existing_table 相同它会复制一个模式,但不复制任何行。诸如 PARTITIONED BY 和 CLUSTERED BY 之类的结构子句在指南中有详细介绍。 Hive分区和存储桶.

表类型及其用法

至于表,它的创建方式与传统关系型数据库中的表创建方式完全相同。诸如筛选和连接之类的功能都可以对表执行。

Hive 处理两种类型的表结构:内部表和外部表,具体取决于模式的加载和设计。 蜂房这项选择并非无关紧要:它决定了谁拥有数据文件以及在删除表时数据文件会发生什么情况。

Hive 中的内部表

  • 内部表本质上是紧耦合的。对于这种类型的表,我们必须先创建表,然后才能加载数据。
  • 我们可以称之为模式上的数据。
  • 滴ping 该表的数据和模式都将被删除。
  • 该表的存储位置为/user/hive/warehouse。
  • 内部表也称为托管表,只有内部表才支持 TRUNCATE、ARCHIVE、MERGE、CONCATENATE 和 ACID 事务。

何时选择内部表?

  • 如果处理数据在本地文件系统中可用
  • 如果我们希望 Hive 管理数据的完整生命周期,包括删除

内部表的示例代码片段

  1. 创建内部表
     Hive>CREATE TABLE guruhive_internaltable (id INT,Name STRING);
    	 Row format delimited 
    	 Fields terminated by '\t';
  2. 将数据加载到内表中
        Hive>LOAD DATA INPATH '/user/guru99hive/data.txt' INTO table guruhive_internaltable;
  3. 显示表格内容
        Hive>select * from guruhive_internaltable;
  4. 删除内部表
        Hive>DROP TABLE guruhive_internaltable;

如果您删除了 guruhive_internaltable,则其元数据和数据都将从 Hive 中删除。除非指定了 PURGE 参数,否则这些文件将被移动到 HDFS 回收站文件夹,而不是立即删除。

从下面的截图中,我们可以看到一次会话中所有四个语句的输出,最终以成功删除结束。

创建、加载、查询和删除 Hive 会话ping guruhive_internaltable

从上面的代码和截图中我们可以看到,我们做了以下几件事:

  • 创建内部表
  • 将数据加载到内表中
  • 显示表格内容
  • 删除内部表

Hive 中的外部表

  • 外部表本质上是松耦合的。数据将存储在 HDFS 中。该表将基于 HDFS 数据创建。
  • 换句话说,我们可以说它是在数据上创建模式。
  • 坠落时ping 它只会删除表的架构,数据仍将像以前一样存储在 HDFS 中。
  • 外部表提供了一种选项,可以为存储在 HDFS 中的数据创建多个模式,而不是每次更新模式时都删除数据
  • 从 Hive 4.0.0 开始,将表属性 external.table.purge 设置为 true 会使 DROP 操作也删除数据。

何时选择外部表?

  • 如果处理数据在HDFS中可用。
  • 当文件在 Hive 之外使用时很有用

外部表的示例代码片段

  1. 创建外部表
    Hive>CREATE EXTERNAL TABLE guruhive_external(id INT,Name STRING)
    	 Row format delimited
    	 Fields terminated by '\t'
    	 LOCATION '/user/guru99hive/guruhive_external';
  2. 如果在创建表时没有指定数据位置,我们可以手动加载数据。
        Hive>LOAD DATA INPATH '/user/guru99hive/data.txt' INTO TABLE guruhive_external;
  3. 显示表格内容
      Hive>select * from guruhive_external;
  4. 删除外部表
      Hive>DROP TABLE guruhive_external;

从以下截图中我们可以看到输出结果。请注意,末尾的删除操作仅移除了模式文件,LOCATION 路径下的文件保持不变。

创建、加载、查询和删除 Hive 会话ping guruhive_external

在上面的代码中,我们执行以下操作:

  • 创建外部表
  • 将数据加载到外部表中
  • 显示表格内容
  • Dropping 外部表

内部表与外部表的区别

特性 全内走线 外置
架构 架构上的数据 数据模式
存储位置 /用户/蜂巢/仓库 HDFS 位置由 LOCATION 指定
数据可用性 在本地文件系统中 在 HDFS 中
DROP 的影响 删除架构和数据 仅删除架构,除非 external.table.purge 为 true
截断支持 支持 不支持
ACID交易 支持 不支持

Apache Hive 文档 规则明确规定:Hive 假定它拥有托管表中的数据,而假定它不拥有外部表中的数据,以上所有差异均源于这一单一假设。

ALTER TABLE 和 DROP TABLE 命令参考

以上截图仅展示了重命名和删除操作。这些是实际操作人员在现有表中最常执行的操作。

个人陈述 目的
ALTER TABLE table_name RENAME TO new_name; 重命名表;对于托管表,此操作还会移动其 HDFS 目录。
ALTER TABLE table_name ADD COLUMNS (col_name data_type); 在模式末尾添加一列或多列
ALTER TABLE table_name CHANGE COLUMN old_name new_name data_type; 重命名列或更改其类型
ALTER TABLE table_name REPLACE COLUMNS (…); 将整个列列表替换为新的列列表。
ALTER TABLE table_name SET TBLPROPERTIES ('EXTERNAL'='TRUE'); 将托管表转换为外部表,FALSE 则反转此过程。
删除表 [如果存在] 表名 [清除]; 删除表;PURGE 命令会跳过回收站文件夹,因此数据无法恢复。
TRUNCATE [TABLE] table_name; 删除所有行,但保留架构;仅限托管表

任何脚本都应该包含两项安全措施。`IF EXISTS` 可以防止删除操作对已删除的表失败,而 `DESCRIBE FORMATTED` 则会在执行删除操作之前确认目标是 `MANAGED_TABLE` 还是 `EXTERNAL_TABLE`。

常见问题

运行 DESCRIBE FORMATTED 表名。表类型行会报告 MANAGED_TABLE 或 EXTERNAL_TABLE。在删除表之前进行检查是避免删除其他作业仍在读取的数据的最经济的方法。

是的。ALTER TABLE table_name SET TBLPROPERTIES ('EXTERNAL'='TRUE') 会改变元数据存储中的类型,而 FALSE 则会将其改回原样。数据文件保持不变,因此无需重新加载。

通常情况下不会,只会删除元数据存储条目。但是,从 Hive 4.0.0 开始,如果外部表的 external.table.purge 属性设置为 true,则 DROP 命令也会删除其数据,因此请先检查这些属性。

现在,普通的 CREATE TABLE 语句默认会生成一个受管理的事务性 ORC 表,而不是简单的文本表。添加 EXTERNAL 关键字才能在 Hive 3 集群上保留旧的非 ACID 行为。

TRUNCATE 会删除所有行,但保留表结构,并且仅适用于托管表。DROP 会同时删除表结构。当表定义需要在重新加载后保留时,TRUNCATE 是更安全的选择。

不。Hive 在元数据存储中会将标识符转换为小写,因此 GURU_SAMPLE 和 guru_sample 指向的是同一张表。数据内部的字符串值仍然区分大小写,这就是为什么 WHERE 子句仍然可能遗漏某些行的原因。

是的。目录工具中的机器学习功能会分析列基数、空值率和查询模式,然后提出数据类型、文件格式和分区键的建议。请将输出结果视为草稿,因为模型无法看到计划的工作负载。

Copilot 可以根据简短的注释完成 CREATE、ALTER 和 DROP 语句,而代理助手可以生成完整的迁移脚本。 Rev请查看 EXTERNAL 关键字和任何 PURGE 选项,因为如果猜错了,就会删除实际数据。

总结一下这篇文章: