1、emp员工表是一个内部表MANAGED_TABLE
(1)emp表,不要删除
hive (testzhang_db)> show tables; hive (testzhang_db)> select * from emp; hive (testzhang_db)> desc formatted emp; #看结构 Table Type: MANAGED_TABLE #内部表
2、emp1表,删除实验
hive (testzhang_db)> select * from emp1; [hadoop@hadoop000 data]$ mysql -uroot -proot #查看元数据 [hadoop@hadoop000 data]$ cd $HIVE_HOME [hadoop@hadoop000 hive-1.1.0-cdh5.15.1]$ cd conf/ [hadoop@hadoop000 conf]$ cat hive-site,xml #查看这里的数据库,是hadoop_hive
mysql> use hadoop_hive; mysql> show tables; mysql> select * from TBLS \G; #看表信息 TBL_NAME: emp1 TBL_TYPE: MANAGED_TABLE
[hadoop@hadoop000 ~]$ hadoop fs -ls /user/hive/warehouse/emp1 #此时这里是有文件存在的
然后在hive中做删除操作,删除后,在hive中会找不到,在HDFS上也找不到,mysql上的也删掉了。
emp1实际上没删除。emp2\3应是之前删除的。
hive (testzhang_db)> drop table emp1;
即:删除hive内部表,HDFS上的数据被删除 & Meta也被删除(MySQL)
3、创建外部表
(1)在HDFS上的存储路径是/external/empme/
(2)此时表是空的
hive (testzhang_db)> CREATE EXTERNAL TABLE emp_external_me( > empno int, > ename string, > job string, > mgr int, > hiredate string, > sal double, > comm double, > deptno int > ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t‘ > location ‘/external/empme/‘;
hive (testzhang_db)> LOAD DATA LOCAL INPATH ‘/home/hadoop/data/emp.txt‘ OVERWRITE INTO TABLE emp_external_me; hive (testzhang_db)> select * from emp_external_me;
[hadoop@hadoop000 data]$ hadoop fs -ls /external/empme
此时HDFS中也有emp.txt
4、查询外部表 EXTERNAL_TABLE
hive (testzhang_db)> desc formatted emp_external_me;
Table Type: EXTERNAL_TABLE
5、查看外部表的元数据
mysql> use hadoop_hive Database changed mysql> select * from TBLS \G; TBL_NAME: emp_external_me TBL_TYPE: EXTERNAL_TABLE
6、外部表测试
(1)实际上我没测
(2)首先删除刚刚创建的hive中的emp_external_me
hive (testzhang_db)> drop table emp_external_me;
(3)查找hive中的数据,肯定是没有了
hive (testzhang_db)> select * from emp_external_me;
(4)查找mysql中的数据,也没有了
mysql> select * from TBLS \G;
(5)在HDFS上查找,是有数据的
[hadoop@hadoop000 data]$ hadoop fs -ls /external/empme
7、内部表和外部表的区别
(1)经过步骤2和步骤6的测试,得出的结果:
外部表: HDFS上的数据不被删除 & Meta 被删除
内部表:HDFS上的数据被删除 & Meta 被删除
(2)就算删除了,再创建一份表即可,即执行步骤3创建表,而不需要载入数据。
(3)所以在生产上,优先考虑创建外部表。