[Hive] hive的内部表和外部表
2019-08-07 本文已影响0人
LZhan
早上在地铁上不经意看到这个问题,隐约记得自己曾经整理过,不过现在已经不是很清晰,只能记得内部表和外部表区别是有无external修饰,删除内部表数据是元数据与存储在hdfs上的数据一起删除掉,但是外部表删除仅仅删除元数据;
所以说记得笔记,转载的博客得常常看啊!
1、内部表
创建内部表的语句:
create table test (name string,age string) location '/input/table_data'
上传数据到表中:
load data inpath '/input/data' into table test
这里会将hdfs的/input/data目录下的数据转移到test表数据的存储目录,即/input/table_data目录下。
在我们删除test表之后,会将test表的数据和元数据信息全部删除,即最后的/input/table_data下没有数据
所以在工作中,相对于内部表,更多的是创建外部表
2、外部表
创建外部表的语句:会带有EXTERNAL关键字
CREATE EXTERNAL TABLE IF NOT EXISTS persona.location_info
(
member_id BIGINT COMMENT '会员Id',
is_da BOOLEAN COMMENT '是否会员',
city STRING COMMENT '常居地'
)
STORED AS PARQUET
LOCATION '/persona/data/location_info'
工作中,给一张新建的hive外部表导入数据,一般就是:
result.write.mode(SaveMode.Overwrite).parquet("/persona/data/location_info")
将查询得到的数据以parquet格式写到表存储的路径上。
一般是不会使用insert,就算只是插入一条记录也会进行MapReduce操作
3、说说上面提到的元数据信息
相关博客链接:
https://www.cnblogs.com/1130136248wlxk/articles/5517909.html
https://www.jianshu.com/p/ccf9c8a43e61
<1> hive版本表
version:存储hive的版本信息的表,有且只能有一条记录,多或者少都不行
<2> 数据库相关的表
image.png
dbs是主表,dbs示例数据:
image.png
<3> 还有与表相关的表,分区相关的表等等