📜  Hive内部表和外部表的区别(1)

📅  最后修改于: 2023-12-03 15:15:32.227000             🧑  作者: Mango

Hive内部表和外部表的区别

在使用Hive时,我们经常会遇到内部表和外部表这两个概念。它们有什么区别呢?

1. 内部表

内部表,顾名思义,就是存在于Hive自己的文件系统中的表格。Hive会将查询的结果写入内部表中,从而方便查询和存储。内部表的数据可以是压缩的,也可以使用某种格式进行序列化存储。当删除内部表时,Hive会自动删除与之相关的数据文件。

1.1 创建内部表

创建内部表的语法如下:

CREATE TABLE <table_name>
([<col_name> <data_type> [COMMENT <col_comment>] [, ...]])
[COMMENT <table_comment>]
[ROW FORMAT serde <serde_class> [WITH SERDEPROPERTIES (<property_key>='<property_value>', ...)]]
[STORED AS <file_format>]

其中,STORED AS关键字指定了内部表中数据的存储格式,默认是TextFile,也可以选择其他格式,例如ParquetORC

1.2 读写内部表

读写内部表的语法和普通表格是一样的。例如:

SELECT * FROM <table_name>;
INSERT INTO <table_name> VALUES (...);
1.3 删除内部表

可以使用DROP TABLE语句删除内部表。例如:

DROP TABLE <table_name>;
2. 外部表

外部表是指与Hive文件系统外部的表格。外部表的数据文件存储在Hadoop集群中,而不是Hive自己的文件系统中。当删除外部表时,不会自动删除其相关的文件。

2.1 创建外部表

创建外部表的语法类似于内部表:

CREATE EXTERNAL TABLE <table_name>
([<col_name> <data_type> [COMMENT <col_comment>] [, ...]])
[COMMENT <table_comment>]
[ROW FORMAT serde <serde_class> [WITH SERDEPROPERTIES (<property_key>='<property_value>', ...)]]
[STORED AS <file_format>]
[LOCATION '<hdfs_path>']

其中,LOCATION关键字指定了外部表数据文件存储的路径。

2.2 读写外部表

读写外部表的语法和内部表差不多:

SELECT * FROM <table_name>;
INSERT INTO <table_name> VALUES (...);
2.3 删除外部表和数据文件

如果只删除外部表,其数据文件仍然会存在。因此,如果想要删除外部表的同时删除其数据文件,需要加上PURGE关键字。例如:

DROP TABLE <table_name> PURGE;
3. 总结
  • 内部表和外部表的主要区别在于数据文件存储的位置和删除方式。
  • 内部表将数据文件存储在Hive自己的文件系统中,删除内部表时会自动删除数据文件。
  • 外部表将数据文件存储在Hadoop集群中,删除外部表时不会删除数据文件。