Hive内部表和外部表的区别详解

内部表&外部表

未被external修饰的是内部表(managed table),被external修饰的为外部表(external table); 
区别: 
内部表数据由Hive自身管理,外部表数据由HDFS管理; 
内部表数据存储的位置是hive.metastore.warehouse.dir(默认:/user/hive/warehouse),外部表数据的存储位置由自己制定; 
删除内部表会直接删除元数据(metadata)及存储数据;删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除; 
对内部表的修改会将修改直接同步给元数据,而对外部表的表结构和分区进行修改,则需要修复(MSCK REPAIR TABLE table_name;)

如下,进行试验进行理解

试验理解

创建内部表t1

create table t1(
    id      int
   ,name    string
   ,hobby   array<string>
   ,add     map<String,string>
)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

这里写图片描述 
2. 查看表的描述:desc t1; 
这里写图片描述

装载数据(t1)

注:一般很少用insert (不是insert overwrite)语句,因为就算就算插入一条数据,也会调用MapReduce,这里我们选择Load Data的方式。

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
  • 1

创建一个文件粘贴上述记录,并上载即可,如下图: 
这里写图片描述 
文件内容如下

1,xiaoming,book-TV-code,beijing:chaoyang-shagnhai:pudong
2,lilei,book-code,nanjing:jiangning-taiwan:taibei
3,lihua,music-book,heilongjiang:haerbin
  • 1
  • 2
  • 3

然后上载

load data local inpath '/home/hadoop/Desktop/data' overwrite into table t1;
  • 1

别忘记写文件名/data,笔者第一次忘记写,把整个Desktop上传了,一查全是null和乱码。。。。 
查看表内容:

select * from t1;
  • 1

这里写图片描述

创建一个外部表t2

create external table t2(
    id      int
   ,name    string
   ,hobby   array<string>
   ,add     map<String,string>
)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
location '/user/t2'
;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

这里写图片描述

装载数据(t2)

load data local inpath '/home/hadoop/Desktop/data' overwrite into table t2;
  • 1

这里写图片描述

查看文件位置

如下图,我们在NameNode:50070/explorer.html#/user/目录下,可以看到t2文件 
这里写图片描述

t1在哪呢?在我们之前配置的默认路径里 
这里写图片描述

同样我们可以通过命令行获得两者的位置信息:

desc formatted table_name;
  • 1

这里写图片描述

这里写图片描述 
注:图中managed table就是内部表,而external table就是外部表。

分别删除内部表和外部表

下面分别删除内部表和外部表,查看区别 
这里写图片描述

观察HDFS上的文件

发现t1已经不存在了 
这里写图片描述

但是t2仍然存在 
这里写图片描述
因而外部表仅仅删除元数据

重新创建外部表t2

create external table t2(
    id      int
   ,name    string
   ,hobby   array<string>
   ,add     map<String,string>
)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
location '/user/t2'
;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

这里写图片描述

不往里面插入数据,我们select * 看看结果 
这里写图片描述 

可见数据仍然在!!!


转自:https://blog.csdn.net/qq_36743482/article/details/78393678

猜你喜欢

转载自blog.csdn.net/gameovertryagain/article/details/80418793