赞
踩
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仓库路径
create table tableA(id int,name string);
内部表默认的路径实在hive默认指定的路径,一般是在hdfs/user/hive/warehouse/database.db/tableA/下,如果删除表会连路径和数据一起删掉
create external table tableA(id int,name string) location '/user/appl/tmp/tableA';
或
create external table tableA(id int,name string);
相比于内部表外部表建表关键字多了一个external,且后面一般会带上路径location,不过如果后面不带location的表的存储路径就是默认在hive仓库路径下即:/user/hive/warehouse/database.db/tableA/
外部和内部的区别
a、最大的区别:外部表删除表仅仅删除hive中元数据不删除数据和指定的路径,内部表如果drop掉表,数据和默认路径都删除了,
b、一般建表没有特别说一定要建内部还是外部表,看个人喜好或者公司规定,若怕数据误删可以建外部表为主
外部表和内部表的转换
1、外部表和内部表其实是可以通过更改属性来转换的。而且不会因为数据量大就转换性能慢,,这个时候就是路径是在默认hive仓库路径下也不会影响外部表的性质,即删除表不会删除路径和数据,修改表名也不会将文件夹名称修改,转换示例如下
内部转外部
alter table tableA set TBLPROPERTIES('EXTERNAL'='true')
外部转内部
alter table tableA set TBLPROPERTIES('EXTERNAL'='false')
2、问题来了::**如果最开始创建了外部表在默认路径下,这个时候如果对表重名的话,相应的路径名是不会变,这个时候如果在重建一个表名和原表一样名称的表就会造成两个表的数据路径是一样的,显然这是不想要的结果,**如下图示例
说明:考虑到hive和impala操作基本类似,没有专门对impal和hive进行说明,以上示例在impala和hive都可以通用,我在实际工作中也用到了更改属性那个示例来进行表备份;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。