Hive 内部表 与 外部表

Hive中的表又分为内部表和外部表 ,Hive 中的每张表对应于HDFS上的一个文件夹,HDFS目录为:/user/hadoop/hive/warehouse/[databasename.db]/table

内部表

创建语句

这里我们采用从之前表中复制表结构和数据

create table ruoze_emp_managed as select * from ruoze_emp;

查看表结构
在这里插入图片描述

mysql中查看hive的表的元数据信息
在这里插入图片描述

查看hdfs数据
在这里插入图片描述

这里我们可以之前 内部表中 数据信息 和元数据信息都是有hive自己管理的.

删除内部表

drop table ruoze_emp_managed;

查看hive表
在这里插入图片描述

查看mysql中元数据信息
由之前的 4条 变成3条
在这里插入图片描述

查看hdfs数据
hdfs中的数据也不存在
在这里插入图片描述

内部表总结

  • 内部表中 数据信息 和元数据信息都是有hive自己管理的
  • 当删除内部表的时候, 元数据 和数据信息全部会删除

外部表

创建语法

创建外部表 需要在 create 后面 增加 external关键字, 如果数据不存放在hive默认的位置需要指定LOCATION

CREATE EXTERNAL TABLE ruoze_emp_external (
empno int, 
ename string, 
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int
)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
LOCATION '/ruoze_emp_external'
;

查看外部表信息

hive查看

desc formatted table_name;

在这里插入图片描述

mysql查看

select * from tbls \G;

在这里插入图片描述

上传数据到Hdfs中

刚刚在创建外部表的时候指定了LOCATION ,所以我们可以将数据上传到这个location位置中,这样表就会有数据

[hadoop@hadoop000 data]$ hdfs dfs -put ./emp.txt /ruoze_emp_external
18/10/25 02:17:31 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
[hadoop@hadoop000 data]$ hdfs dfs -ls /ruoze_emp_external
18/10/25 02:18:03 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 1 items
-rw-r--r--   1 hadoop supergroup        700 2018-10-25 02:17 /ruoze_emp_external/emp.txt

在这里插入图片描述

删除外部表

drop table ruoze_emp_external;

hive 查看
在这里插入图片描述

mysql查看
之前的第4条没有了
在这里插入图片描述

hdfs查看
在这里插入图片描述

hdfs中还是有的.

外部表总结

  • 外部的创建 元数据是hive管理的 但是数据可以由我们自己管理
  • 删除外部表的时候,只会删除元数据信息,不会删除数据信息

内部表 外部表

  • 内部表数据由Hive自身管理,外部表数据由HDFS管理;
  • drop表时,Managed Table会同时删去data(存储在HDFS上)和meta data(存储在MySQL),而External Table只会删meta data
  • 内部表数据存储的位置是hive.metastore.warehouse.dir(默认:/user/hive/warehouse),外部表数据的存储位置由自己制定;
  • 对内部表的修改会将修改直接同步给元数据,而对外部表的表结构和分区进行修改,则需要修复(MSCK REPAIR TABLE table_name;)

生产中99%都用到的是外部表,因为可以有一份备份,如果删除表用LOAD DATA LOCAL INPATH 在传一份就可以了。
生产中1%用到的内部表的情况,外面的数据传过来,你这里可建立外部表,如果表删没了再导一份。

猜你喜欢

转载自blog.csdn.net/weixin_40420525/article/details/83382938