hive 内部表外部表区别
1.简介
hive 是基于hadoop的数据仓库工具,本身并不存储数据,hive会把数据存储到 hdfs中,利用自带的sql解析引擎,把sql 语句转换成 mr job(mapreduce的任务) ,在 hadoop 的 mapreduce 引擎上对数据进行查询、统计和分析。
2.建表语句的区别
- 外部表 - 被 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'
;
3. 管理范围不同
- 内部表
Hive 管理内部表的元数据以及表的实际数据。当使用 drop 删除内部表的时候,不但会删除表的元数据,连同其对应的数据(即数据文件),都会被删除。
- 外部表
Hive 只管理外部表的元数据,表的实际数据与元数据只是做了一个映射关系,可以借助元数据信息查询到表的实际数据信息。当使用 drop 删除外部表的时候, 只有元数据会被删掉,表的实际数据仍然会存放在 hdfs 对应的路径中。
4. 存储路径的区别
- 内部表
在创建内部表的时候,一般不需要指定数据的存储路径,在创建的时候,会将数据的存储在 hdfs 默认的路径中。一般是:/hive/warehouse/数据库名称/表名。
- 外部表
在实际使用中,为了让数据存放更安全,外部表一般会搭配 location 来指定数据的存放目录,如果不使用 location ,将会默认在 /hive/warehouse/数据库名称/表名 路径下建立数据目录。
注意,不论是外部表还是内部表,都能使用 location 指定数据的存放路径的。
5. 表结构与分区更改的区别
当内部表的结构与分区发生变化的时候,会自动同步到元数据。
当外部表的结构与分区发生变化的时候,则需要使用 msck repair table table_name 进行修复。
总结
对比项 | 内部表 | 外部表 |
---|---|---|
Hive 管理范围建表语句 | 元数据、实际的表数据 | 元数据 |
建表语句 | 不需要 external 关键字修饰 | 需要 external 关键字修饰 |
drop 表后果 | 删除元数据和实际的表数据 | 只删除元数据,实际的表数据保留 |
存储路径 | 一般在默认位置存储数据 | 一般搭配 location 指定数据存放位置 |
表结构和分区更改的区别 | 自动同步到元数据 | 需要修复表 |