Hive的内部表和外部表的增删改以及区别?

1,现象演示:

创建数据库:
create database if not exists ma_ex
comment 'manager_external'
with dbproperties ('name'='dachun','date'='20200202');
我的另一篇博客详细介绍了Hive的数据库操作

2,内部表演示

创建内部表(MANAGED _TABLE):创建内部表也可以指定location,内部表的数据文件就会存储在指定路径下,否则走默认的当前库/表名
create table if not exists one(
id int,
name string
) row format delimited fields termited by ',';

内部表insert方式插入数据,生产千万不要用
因为他是每插入一条数据,就会在该表目录下生成一个小文件,每一个小文件对应一条数据,10W条对应10W个小文件
insert into one values(1,'dema');
insert into one values(2,'xiya');


小文件

内部表load方式插入数据
load data local inpath '/home/hadoopadmin/one.txt' into table one
load方式直接把这个文件拷贝到了目录下.

load方式

或者不用这个load命令,直接再拷贝一个文件到表one目录下,执行select* from one发现数据也加载进来了
hdfs dfs -put /home/hadoopadmin/one.txt
/user/hive/warehouse/ma_ex.db/one/one2.txt

直接上传文件方式

在MySQL的元数据表TBLS里面查看
select * from TBLS;
字段TBL_TYPE=MANAGED_TABLE表示是内部表


image.png

3,外部表不带location演示

创建外部表
create external table if not exists one_external(
id int,
name string
) row format delimited fields terminated by ',';

如果创建外部表时候末尾没有加上location,
他默认读取的是自己database/自己tablename/文件

通过hdfs上传文件方式往这个目录下上传一个文件
hdfs dfs -put /home/hadoopadmin/one.txt /user/hive/warehouse/ma_ex.db/one_external

通过load方式网这个表里面添加数据
load data local inpath '/home/hadoopadmin/one2.txt' into table one_external;

外部表同样也可以通过insert方式添加数据,同样对应目录下新增一个文件
insert into one_external values(1,'lala');

上面三中添加方式都可以在外部表添加数据

image.png

查看元数据TABLS


image.png

4,外部表带location演示

创建外部表时候指定新的location
首先将文件导入到外部表的目录下
hdfs dfs -put /home/hadoopadmin/one.txt /user/hive/warehouse/external/

create external table if not exists one_external2(
id int,
name string
) row format delimited fields terminated by ','
location '/user/hive/warehouse/external/'

因为我们在外部表的路径下已经导入了文件
直接执行select * from one_external2是能够看到数据的

hive (ma_ex)> select * from one_external2;
OK
3 shuruima
4 heisemeigui
5 niuqu

在元数据存储的表的表TBLS也能看到


image.png

但是在hdfs上面并不能能够看到相关的目录,在该表数据库文件夹的下关于external2的目录也无法找到,通过下面这个desc formatted 表名,能够知道这个外部表的路径定在了外部表建表语句的location的文件夹下


image.png

为什么可以确认外部表的文件夹自动定位到了location文件夹下呢?
1,通过下面的desc table formatted确定了
2,insert into 表 values ();执行完之后,发现这个外部表的location文件夹下多出来一个文件,这个文件就是我们插入的这一条数据,所以呢,这就定位到了,创建带location的外部表对应的表数据存储路径就默认使用这个location位置

5,desc formatted 表名获取信息

使用desc formatted 表名,截图关键点
desc formatted one;


one

desc formatted one_external;


one_external

desc formatted one_external2;


one_external2

我们会发现指定location的外部表,这个location路径就是它对应的文件的路径,他并没有自己创建相关路径,但是创建内部表和没有指定路径的外部表他是在数据库的hdfs路径下真实创建了这个文件夹.下面以删除表为例测试.

6,总结

总结:内部表
内部表创建时候,会在hdfs文件系统上面创建相应的路径文件夹,相关表的数据都会存在里面,如果是insert into 进去的数据,每一条都会对应一个小文件,可以把文件已load方式加载进去或者直接把文件放到hdfs文件系统对应的路径里面,前提是创建表的时候,制定好分隔符,然后执行select * from 表,就可以将文件里面的数据读到表中
删除内部表(MANAGED_TABLE)的时候,在 MySQL的元数据表TBLS里面对应的one表内容被删除,另外HDFS文件系统上面的该表的数据都会被删除

总结:外部表没有指定location.
外部表没有指定location版本创建时候,会在hdfs文件系统上面创建相应的路径文件夹,相关表的数据都会存在里面,如果是insert into 进去的数据,每一条都会对应一个小文件,可以把文件已load方式加载进去或者直接把文件放到hdfs文件系统对应的路径里面,前提是创建表的时候,制定好分隔符,然后执行select * from 表,就可以将文件里面的数据读到表中
删除时候,对应的hdfs上面的表路径以及数据都不会删除,即使没指定location,自己创建路径的话,还是没有删除.但是在 MySQL的元数据表TBLS里面对应的表内容被删除.

image.png

总结:外部表指定location.
创建时候,如果指定了location的话,该外部表对应的存储路径文件夹=location指定的文件夹位置,通过desc formatted tablename和insert into方式插入一条数据会多一个文件在location文件夹下,得到了验证
删除时候,对应的hdfs上面的表路径以及数据都不会删除,即使没指定location,自己创建路径的话,还是没有删除.但是在 MySQL的元数据表TBLS里面对应的表内容被删除.

7,内部表和外部表和外部表-location三者异同点

内部表和外部表的共同点:
指定好了分隔符的情况下,直接往他们相关的目录下不管是load文件,还是直接hdfs命令上传文件到这个路径,都可以被识别为表数据,而且都会在MySQL元数据TBLS表里面存储,删除表的时候对应的TBLS元数据都被删除
另外在hdfs文件系统的a数据库文件夹下都有一个one的文件夹,如果a数据库下创建一个内部表one,或者创建一个外部表one指定location为one这个路径,或者创建外部表one不带location,他们三个读出来的数据一样.

内部表和外部表不同点:
内部表会把hdfs表相关的文件文件夹全干掉,外部表就不会

外部表指定location和没指定location异同点:
指定location的话该表的数据都存储在location下,没指定location的话,数据都存储在当前数据库文件夹下一个名字为该表名的文件夹下,删除表时候hdfs上面数据都不会被删除,但是MySQL的元数据库表TBLS数据都会被删除.

Hive官方介绍
https://cwiki.apache.org/confluence/display/Hive/Managed+vs.+External+Tables

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356

推荐阅读更多精彩内容