简介
Hive 实际上是一个基于 Hadoop 的数据仓库工具,本身并不存储数据。Hive 会把 表数据 存放到 hdfs 中,并利用自带的 sql 解析引擎,将 sql 语句转换成 mr job ,在 hadoop 的 mapreduce 引擎上对数据进行查询、统计和分析。
内部表和外部表最根本的区别在于,是否由 Hive 管理表的全生命周期。如,Hive 管理内部表的元数据以及实际的表数据,而对于外部表,则只管理它的元数据。
以下,将会更具体地阐述 内部表 和外部表的区别。
1. 建表语句的区别
外部表的建表语句需要被 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
location '/test';
- 内部表
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;
内表外表之间的转换:
--内转外
ALTER TABLE tablename SET TBLPROPERTIES ('EXTERNAL' = 'true');
--外转内
ALTER TABLE tablename SET TBLPROPERTIES ('EXTERNAL' = 'false');
2. Hive 管理范围不同
- 内部表
Hive 管理内部表的元数据以及表的实际数据。当使用 drop 删除内部表的时候,不但会删除表的元数据,连同其对应的数据(即数据文件),都会被删除。
- 外部表
Hive 只管理外部表的元数据,表的实际数据与元数据只是做了一个映射关系,可以借助元数据信息查询到表的实际数据信息。当使用 drop 删除外部表的时候,只有元数据会被删掉,表的实际数据仍然会存放在 hdfs 对应的路径中。
3. 存储路径的区别
- 内部表
在创建内部表的时候,一般不需要指定数据的存储路径,在创建的时候,会将数据的存储在 hdfs 默认的路径中。一般是:/hive/warehouse/数据库名称/表名。
- 外部表
在实际使用中,为了让数据存放更安全,外部表一般会搭配 location 来指定数据的存放目录,如果不使用 location ,将会默认在 /hive/warehouse/数据库名称/表名 路径下建立数据目录。
注意,不论是外部表还是内部表,都能使用 location 指定数据的存放路径的。
4. 表结构与分区更改的区别
当内部表的结构与分区发生变化的时候,会自动同步到元数据。
当外部表的结构与分区发生变化的时候,则需要使用 msck repair table table_name 进行修复。
5. 表名称修改
假如我内部表和外部表都指向同一个文件,此时我修改内部表名字,对应的location信息和文件名包括路径都会随之发生变化,而外部表则会找不到路径文件;
而假如我修改的是外部表的名字,对应的location和文件路径都不会发生变化,因此对自身和内部表的使用是没有影响的。
这里想说明一个什么呢?
就是内部表他的location只是一个临时概念,随着表名修改他会自己做相应修改,毕竟元数据和实际数据都归hive管理;
而外部表是个永久概念,它只要定义好了,除非你亲自去改它的location,他才会变化,因为hive只能管理元数据,不能随意修改实际数据所对应的路径等。
总结
对比项内部表外部表Hive 管理范围建表语句元数据、实际的表数据元数据建表语句不需要 external 关键字修饰需要 external 关键字修饰drop 表后果删除元数据和实际的表数据只删除元数据,实际的表数据保留存储路径一般在默认位置存储数据一般搭配 location 指定数据存放位置表结构和分区更改的区别自动同步到元数据需要修复表表名称修改location和路径文件一起发生变化location和路径文件不变
参考:Hive - 内部表和外部表的区别 - 知乎Hello我是高月!我将会在这篇文章中介绍 Hive 表中内部表和外部表的区别。文章有误之处,欢迎评论区评论,帮助纠正哦简介Hive 实际上是一个基于 Hadoop 的数据仓库工具,本身并不存储数据。Hive 会把 表数据 存…https://zhuanlan.zhihu.com/p/588997327
版权归原作者 不会Hive的啊扬 所有, 如有侵权,请联系我们删除。