1. 程式人生 > 其它 >電商專案實戰Hive實現-外部表在Hive中的使用

電商專案實戰Hive實現-外部表在Hive中的使用

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)所以在生產上,優先考慮建立外部表。