测试一下,放三个文件到HDFS中
hdfs dfs -mkdir /input
hdfs dfs -put student01.txt /input
hdfs dfs -put student02.txt /input
hdfs dfs -put student03.txt /input
测试1:
现在建立一个外部表来指向这三个文件
create external table external_student
(sname string, age int)
row format delimited fields terminated by ','
location '/input';
发现这张表把元数据信息存放在mysql中,在hdfs上并没有任何数据的信息
hdfs dfs -rm /input/student03.txt
发现外部表查询数据也减少了
测试2:
创建内部表
create table internal_student
(sname string, age int)
row format delimited fields terminated by ','
location '/input';
这种情况下,发现与外部表的情况是相同的
1. 并没有在hdfs下创建表
2. 删除hdfs中的数据,其查询的结果也没有了
但是当我删除内部表的时候,数据被删除了
测试3:
如果load的时候,使用内部表load
create table internal_student2
(sname string, age int)
row format delimited fields terminated by ',';
load data inpath '/input/student01.txt' overwrite into table internal_student2
这句的结果是:
而
数据文件只有一份,会被传来传去
测试4:
如果想生成一份数据,而不要传来传去,那么通过select+insert来进入内部表
insert into table internal_student select sname, age from internal_student2;
其会启动一个mr的程序,生成结果放到/input下
总结:
1. 删除内部表会直接删除元数据及存储数据,删除外部表仅仅会删除元数据
2. 内部表数据由hive自身管理(因为内部表数据会放到hdfs hive相关目录下),而外部表数据仍然是放在HDFS上的,由HDFS自己管理