Hive外部表和内部表的区别(案例详解)

1.主要区别

未被external修饰的是内部表(managed table),被external修饰的为外部表(external table);
区别:

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

2.案例

(1)创建内部表t1

create table t1(
    id      int
   ,name    string
   ,hobby   array
   ,add     map
)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
;

Hive外部表和内部表的区别(案例详解)_第1张图片

(2)查看表结构

desc t1;

Hive外部表和内部表的区别(案例详解)_第2张图片

(3)装载数据到t1

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

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

创建一个文件粘贴上述记录,并上载即可,如下图:
Hive外部表和内部表的区别(案例详解)_第3张图片
文件内容如下:

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

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

select * from t1

Hive外部表和内部表的区别(案例详解)_第4张图片

(4)创建一个外部表t2

create external table t2(
    id      int
   ,name    string
   ,hobby   array
   ,add     map
)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
location '/user/t2'
;

Hive外部表和内部表的区别(案例详解)_第5张图片

(5)装载数据t2

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

(6)查看文件位置

如下图,我们在NameNode:50070/explorer.html#/user/目录下,可以看到t2文件
Hive外部表和内部表的区别(案例详解)_第6张图片
t1在哪呢?在我们之前配置的默认路径里
Hive外部表和内部表的区别(案例详解)_第7张图片
我们可以通过命令查看到两个表的位置

语法格式  desc formatted table_name;

Hive外部表和内部表的区别(案例详解)_第8张图片
Hive外部表和内部表的区别(案例详解)_第9张图片

注:图中managed table就是内部表,而external table就是外部表。

(7)观察HDFS上的文件

发现t1已经不存在了
Hive外部表和内部表的区别(案例详解)_第10张图片
但是t2仍然存在
Hive外部表和内部表的区别(案例详解)_第11张图片
因而外部表仅仅删除元数据

(8)重新创建外部表t2

create external table t2(
    id      int
   ,name    string
   ,hobby   array
   ,add     map
)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
location '/user/t2'
;

Hive外部表和内部表的区别(案例详解)_第12张图片
不往里面插入数据,我们select * 看看结果
Hive外部表和内部表的区别(案例详解)_第13张图片
可见数据仍然在.

你可能感兴趣的:(Hive学习)