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

表操作,例如创建、修改和删除ping 本演练将展示 Hive 中的表。每个操作首先以实时会话的形式呈现,然后以可重用语句的形式呈现。
如何在 Hive 中创建、修改和删除表
在下面的屏幕截图中,我们正在创建一个带有列的表并更改表名。
- 创建名为 guru_sample 的表,其中包含两个列,列名分别为“empid”和“empname”。
- 显示 guru99 数据库中存在的表格
- guru_sample 显示在表格下方
- 将表“guru_sample”更改为“guru_sampleNew”
- 同样,当你执行“show”命令时,它会显示新名称guru_sampleNew。
下面的步骤将按顺序运行所有五个步骤。 蜂巢> 提示,并且在重命名前后各调用一次 SHOW TABLES,使效果可见。
Dropping 表 guru_sampleNew:
一条 DROP TABLE 语句即可删除重命名的表,Hive 会返回 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 管理数据的完整生命周期,包括删除
内部表的示例代码片段
- 创建内部表
Hive>CREATE TABLE guruhive_internaltable (id INT,Name STRING); Row format delimited Fields terminated by '\t';
- 将数据加载到内表中
Hive>LOAD DATA INPATH '/user/guru99hive/data.txt' INTO table guruhive_internaltable;
- 显示表格内容
Hive>select * from guruhive_internaltable;
- 删除内部表
Hive>DROP TABLE guruhive_internaltable;
如果您删除了 guruhive_internaltable,则其元数据和数据都将从 Hive 中删除。除非指定了 PURGE 参数,否则这些文件将被移动到 HDFS 回收站文件夹,而不是立即删除。
从下面的截图中,我们可以看到一次会话中所有四个语句的输出,最终以成功删除结束。
从上面的代码和截图中我们可以看到,我们做了以下几件事:
- 创建内部表
- 将数据加载到内表中
- 显示表格内容
- 删除内部表
Hive 中的外部表
- 外部表本质上是松耦合的。数据将存储在 HDFS 中。该表将基于 HDFS 数据创建。
- 换句话说,我们可以说它是在数据上创建模式。
- 坠落时ping 它只会删除表的架构,数据仍将像以前一样存储在 HDFS 中。
- 外部表提供了一种选项,可以为存储在 HDFS 中的数据创建多个模式,而不是每次更新模式时都删除数据
- 从 Hive 4.0.0 开始,将表属性 external.table.purge 设置为 true 会使 DROP 操作也删除数据。
何时选择外部表?
- 如果处理数据在HDFS中可用。
- 当文件在 Hive 之外使用时很有用
外部表的示例代码片段
- 创建外部表
Hive>CREATE EXTERNAL TABLE guruhive_external(id INT,Name STRING) Row format delimited Fields terminated by '\t' LOCATION '/user/guru99hive/guruhive_external';
- 如果在创建表时没有指定数据位置,我们可以手动加载数据。
Hive>LOAD DATA INPATH '/user/guru99hive/data.txt' INTO TABLE guruhive_external;
- 显示表格内容
Hive>select * from guruhive_external;
- 删除外部表
Hive>DROP TABLE guruhive_external;
从以下截图中我们可以看到输出结果。请注意,末尾的删除操作仅移除了模式文件,LOCATION 路径下的文件保持不变。
在上面的代码中,我们执行以下操作:
- 创建外部表
- 将数据加载到外部表中
- 显示表格内容
- 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`。




