前言
Hive 是一个基于 Hadoop 的数据仓库工具,本身并不存储数据,它会表数据存放到 hdfs 中,并利用自带的 sql 解析引擎,将 sql 语句转换成 mr job ,在 hadoop 的 mapreduce 引擎上对数据进行查询、统计和分析。
内部表和外部表最根本的区别在于,是否由Hive管理表的全生命周期。例如,Hive 管理内部表的元数据以及实际的表数据,而对于外部表,则只管理它的元数据。
一、建表语句的区别
外部表的建表语句需要被 external 修饰,但是内部表是不需要的。
- 外部表 - 被 external 修饰
create external table if not exists table_name(
prd_wid bigint comment '时间维度'
,w_insert_dt string comment '数据仓库插入时间'
,name string comment '名称'
,age bigint comment '年龄'
)comment '外部表'
partitioned by (dt string)
row format delimited fields terminated by '\t'
stored as parquet
;
- 内部表
create table if not exists table_name(
prd_wid bigint comment '时间维度'
,w_insert_dt string comment '数据仓库插入时间'
,name string comment '名称'
,age bigint comment '年龄'
)comment '内部表'
partitioned by (dt string)
row format delimited fields terminated by '\t'.
stored as parquet
location '/test'
;
二、Hive管理范围不同
- 内部表
Hive管理内部表的元数据以及表的实际数据。当使用drop删除内部表的时候,不但会删除表的元数据,连同其对应的数据(即数据文件),都会被删除。
- 外部表
Hive只管理外部表的元数据,表的实际数据与元数据只是做了一个映射关系,可以借助元数据信息查询到表的实际数据信息。当使用drop删除外部表的时候,只有元数据会被删掉,表的实际数据仍然会存放在hdfs对应的路径中。
三、存储路径的区别
- 内部表
在创建内部表的时候,一般不需要指定数据的存储路径,在创建的时候,会将数据的存储在 hdfs 默认的路径中。一般是:/hive/warehouse/数据库名称/表名。
- 外部表
在实际使用中为了让数据存放更安全,外部表一般会搭配 location 来指定数据的存放目录,如果不使用 location ,将会默认在 /hive/warehouse/数据库名称/表名路径下建立数据目录。
注意,不论是外部表还是内部表,都能使用 location 指定数据的存放路径的
四、表结构与分区更改的区别
当内部表的结构与分区发生变化的时候,会自动同步到元数据。当外部表的结构与分区发生变化的时候,则需要使用msck repair table table_name 进行修复。
总结
对比项 | 内部表 | 外部表 |
---|---|---|
Hive 管理范围建表语句 | 元数据、实际的表数据 | 元数据 |
建表语句 | 不需要 external 关键字修饰 | 需要 external 关键字修饰 |
drop 表后果 | 删除元数据和实际的表数据 | 只删除元数据,实际的表数据保留 |
存储路径 | 一般在默认位置存储数据 | 一般搭配 location 指定数据存放位置 |
表结构和分区更改的区别 | 自动同步到元数据 | 需要修复表 |