在Hive中,可以通过不同的关键字来创建不同类型的表。以下是创建表的基本语法:
sql
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
(col_name data_type [COMMENT 'col_comment'], ...)
[PARTITIONED BY (col_name data_type [COMMENT 'col_comment'], ...)]
[COMMENT 'table_comment']
[WITH SERDEPROPERTIES ('key1'='value1', 'key2'='value2', ...)]
[
[ROW FORMAT row_format] [STORED AS file_format]
]
[LOCATION 'hdfs_path']
[TBLPROPERTIES ('key1'='value1', 'key2'='value2', ...)]
[CACHED IN 'pool_name' [WITH REPLICATION = integer] | UNCACHED]
EXTERNAL
关键字用于区分内部表和外部表。LOCATION
参数指定了表数据的存储路径,默认情况下为Hive仓库路径。
sql
CREATE EXTERNAL TABLE tableA(id int, name string) LOCATION '/user/appl/tmp/tableA';
外部表的数据存储路径默认为Hive仓库路径,如 /user/hive/warehouse/database.db/tableA/
。删除外部表只会移除Hive中的元数据,而不会删除实际的数据文件。
外部表和内部表之间可以通过修改表属性进行相互转换,而不会因为数据量大而导致性能下降。转换操作不会影响数据的实际存储路径。
```sql -- 将内部表转换为外部表 ALTER TABLE tableA SET TBLPROPERTIES('EXTERNAL'='true');
-- 将外部表转换为内部表 ALTER TABLE tableA SET TBLPROPERTIES('EXTERNAL'='false'); ```
当创建外部表时,如果没有指定路径,则数据路径默认为Hive仓库路径。如果重命名表,数据路径不会随之改变,这可能导致多个表共享同一个数据路径,从而引发问题。
例如,创建一个名为 table_1
的外部表,之后重命名该表为 table_111
,此时表 table_111
和表 table_1
会共享同一个数据路径 /user/hive/warehouse/test.db/table_1
。
在备份表时,可以先将表转换为外部表,然后再进行重命名操作,以避免数据路径冲突。
可以通过执行 DESCRIBE EXTENDED tablename;
命令来查看表的详细属性。此命令在Impala和Hive中均可使用。
通过上述方法,可以有效地管理和备份Hive表,确保数据的安全性和一致性。