Hive外部表

本文详细阐述了Hive中内部表与外部表的区别及创建方法。内部表将数据移动到指定路径,删除时会一并移除数据;外部表仅记录数据位置,删除时仅移除元数据。此外还介绍了Hive的schema on read特性及其对数据导入的影响。

Hive外部表

Hive中表与外部表的区别:
  1. Hive 创建内部表时,会将数据移动到数据仓库指向的路径;
  2. Hive 创建外部表,仅记录数据所在的路径, 不对数据的位置做任何改变;
  3. 在删除表的时候,内部表的元数据和数据会被一起删除, 而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。
注意
  1. 传统数据库对表数据验证是schema on write(写时模式),而 Hive 在load时是不检查数据是否符合schema的,hive 遵循的是schema on read(读时模式),只有在读的时候hive才检查、解析具体的数据字段、schema;
  2. 读时模式的优势是load data 非常迅速,因为它不需要读取数据进行解析,仅仅进行文件的复制或者移动。写时模式的优势是提升了查询性能,因为预先解析之后可以对列建立索引,并压缩,但这样也会花费要多的加载时间。
  3. Hive数据导入表情况:
    • 在LOAD DATA时,如果加载的文件在HDFS上,此文件会被移动到表路径中;
    • 在LOAD DATA时,如果加载的文件在本地,此文件会被复制到HDFS的表路径中;
    • 在LOAD DATA时,会为每一个待导入的文件,启动一个MR任务进行导入。
外部表创建
  1. 如同内部表一样,外部表在创建表时也需要指定数据表所在的数据文件的路径——以下简称为表路径。如果没有指定,Hive会自动分配一个。自动分配的目录是hive主目录下的【表名】目录;
  2. 如果创建外部表时,指定表的数据存储目录。Hive会将此目录下已有的所有文件作为表的数据文件,在查询时进行解析。此时,Hive仍会在hive的目录下创建【表名】的目录,但目录内的内容为空。
e.g
-- 指定表的仓库路径
CREATE EXTERNAL TABLE test_table(id STRING, name STRING) 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ','
LOCATION '/data/test/test_table';
-- 导入数据到表中(文件会被移动到仓库目录/data/test/test_table)
LOAD DATA INPATH '/test_tmp_data.txt' INTO TABLE test_table;
外部表数据删除

上述提到Hive外部表只删除元数据,不删除数据。如果要删除外部表以及外部表数据,则还需通过dfs删除外部表数据存储路径文件。如下:

删除表以及表数据 e.g
-- 删除表(实际是只删除元数据)
DROP TABLE test.test_table;
-- 删除外部表数据文件以及目录
DFS -rm -r /data/test/test_table;
清空外部表数据(实际上是删除数据文件) e.g
-- 删除外部表存储目录下所有数据文件(不删除外部表存储目录)
DFS -rm -r /data/test/test_table/*;
参考

Hive 中内部表与外部表的区别与创建方法

Hive 中,外部表(External Table)的设计特点是仅存储表的元数据定义,而实际数据存储在外部存储系统中(如 HDFS)。因此,直接删除外部表的数据不会像管理内部表(Managed Table)那样自动清除底层数据[^1]。 要删除 Hive 外部表中的数据,需采取以下方法之一或组合使用: ### 删除外部表的元数据 如果仅需要移除表的定义,而不删除底层数据,可以使用 `DROP TABLE` 语句: ```sql DROP TABLE IF EXISTS external_table_name; ``` 此操作仅删除 Hive 中的表定义,原始数据仍然保留在其存储位置[^1]。 ### 手动删除底层数据 由于外部表的数据不由 Hive 管理,因此需要手动从存储系统中删除数据。例如,如果数据存储在 HDFS 上,可以使用以下命令: ```bash hadoop fs -rm -r /path/to/external/table/data ``` ### 清空外部表数据(保留元数据) 若希望清空外部表的数据但仍保留其定义,可以采用以下方法: 1. **重命名外部表并重建**: - 首先重命名原表: ```sql ALTER TABLE external_table_name RENAME TO external_table_name_old; ``` - 然后创建一个空的外部表: ```sql CREATE EXTERNAL TABLE external_table_name ( column1 STRING, column2 INT ) LOCATION '/path/to/new/data/location/'; ``` 2. **使用分区表**(如果适用): - 如果外部表是分区表,可以删除特定分区数据: ```sql ALTER TABLE external_table_name DROP IF EXISTS PARTITION (partition_column='value'); ``` - 此操作会删除对应的元数据,但底层 HDFS 数据仍需手动清理[^1]。 ### 使用 Hive ACID 事务(需启用事务支持) 如果 Hive 环境支持 ACID 事务(Hive 0.14+),可以将外部表设置为事务表,并使用 `DELETE` 语句: ```sql DELETE FROM TABLE external_table_name WHERE condition; ``` 此方法要求 Hive 表和文件格式支持事务性操作,并且底层存储系统需兼容 ACID 语义。 ##
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值