📅  最后修改于: 2023-12-03 15:15:32.227000             🧑  作者: Mango
在使用Hive时,我们经常会遇到内部表和外部表这两个概念。它们有什么区别呢?
内部表,顾名思义,就是存在于Hive自己的文件系统中的表格。Hive会将查询的结果写入内部表中,从而方便查询和存储。内部表的数据可以是压缩的,也可以使用某种格式进行序列化存储。当删除内部表时,Hive会自动删除与之相关的数据文件。
创建内部表的语法如下:
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
,也可以选择其他格式,例如Parquet
或ORC
。
读写内部表的语法和普通表格是一样的。例如:
SELECT * FROM <table_name>;
INSERT INTO <table_name> VALUES (...);
可以使用DROP TABLE
语句删除内部表。例如:
DROP TABLE <table_name>;
外部表是指与Hive文件系统外部的表格。外部表的数据文件存储在Hadoop集群中,而不是Hive自己的文件系统中。当删除外部表时,不会自动删除其相关的文件。
创建外部表的语法类似于内部表:
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
关键字指定了外部表数据文件存储的路径。
读写外部表的语法和内部表差不多:
SELECT * FROM <table_name>;
INSERT INTO <table_name> VALUES (...);
如果只删除外部表,其数据文件仍然会存在。因此,如果想要删除外部表的同时删除其数据文件,需要加上PURGE
关键字。例如:
DROP TABLE <table_name> PURGE;