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%用到的内部表的情况,外面的数据传过来,你这里可建立外部表,如果表删没了再导一份。