Hive管理表,外部表及外部分區表的深入探討


        Hive管理表,也叫內部表。Hive控制着管理表的整個生命周期,默認情況下Hive管理表的數據存放在hive的主目錄:/user/hive/warehouse/下,並且當我們刪除一張表時,這張表的數據也會相應的被刪除掉,在文件層面上講,就是在Hive主目錄下的表目錄以及目錄里面的數據文件都會被刪除掉。

      管理表能夠有效的管理表的數據,但是不利於對數據的分享,同一份數據,我希望既能夠指向表A,有能夠分享給表B,但是相應的這些表不應該控制數據的生命周期,這種表在Hive里面成為外部表。在創建外部表的時候,需要指向數據的具體位置,相當於一個指針,外部表只是引用了數據的地址,訪問表時再根據這個地址指針去找到相應的數據。

     在管理大型數據集時,分區是一個有效的解決辦法,能夠根據分區條件限制訪問的數據量大小,能夠達到優化數據的訪問速度。對於管理管的分區,上節已經詳細講解過了,本節將會針對外部分區表進行講解。

    1. 管理表創建:

CREATE TABLE IF NOT EXISTS emp(
empno STRING,
ename STRING,
job STRING,
mgr STRING,
hiredate STRING,
salary DOUBLE,
comm DOUBLE,
deptno STRING 
)
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\t';

hadoop@192-168-178-134:/usr/local/hive/hive-1.2.2/bin$ cat emp
7369 SMITH CLERK 7902 1980/12/17 1100.00 NULL 20
7499 ALLEN SALESMAN 7698 1981/2/20 1800.00 300.00 30
7521 WARD SALESMAN 7698 1981/2/22 1450.00 500.00 30
7566 JONES MANAGER 7839 1981/4/2 3275.00 NULL 20
7654 MARTIN SALESMAN 7698 1981/9/28 1450.00 1400.00 30
7698 BLAKE MANAGER 7839 1981/5/1 3050.00 NULL 30
7782 CLARK MANAGER 7839 1981/6/9 2450.00 NULL 10
7788 SCOTT ANALYST 7566 1987/4/19 3300.00 NULL 20
7839 KING PRESIDENT NULL 1981/11/17 5000.00 NULL 10
7844 TURNER SALESMAN 7698 1981/9/8 1700.00 NULL 30
7876 ADAMS CLERK 7788 1987/5/23 1400.00 NULL 20
7900 JAMES CLERK 7698 1981/12/3 1150.00 NULL 30
7902 F%FORD ANALYST 7566 1981/12/3 3300.00 NULL 20
7934 MILLER CLERK 7782 1982/1/23 1300.00 NULL 10

將數據導入到管理表中:

hive (jimdb)> LOAD DATA LOCAL INPATH './emp' OVERWRITE INTO TABLE emp;
Loading data to table jimdb.emp
Table jimdb.emp stats: [numFiles=1, numRows=0, totalSize=705, rawDataSize=0]
OK
Time taken: 0.983 seconds

查看相應的數據文件,文件目錄如下:

hadoop@192-168-178-134:/usr/local/hive/hive-1.2.2/bin$ hdfs dfs -ls /user/hive/warehouse/jimdb.db/emp
Found 1 items
-rwxr-xr-x 2 hadoop supergroup 705 2018-06-12 06:27 /user/hive/warehouse/jimdb.db/emp/emp

刪除管理表emp

 hive (jimdb)> drop table emp;

OK
Time taken: 1.793 seconds

然后到數據庫目錄下查看表目錄以及數據文件:

hadoop@192-168-178-134:/usr/local/hive/hive-1.2.2/bin$ hdfs dfs -ls /user/hive/warehouse/jimdb.db/
Found 8 items
drwxr-xr-x - hadoop supergroup 0 2018-06-05 07:15 /user/hive/warehouse/jimdb.db/dept
drwxr-xr-x - hadoop supergroup 0 2018-06-06 08:10 /user/hive/warehouse/jimdb.db/dual
drwxr-xr-x - hadoop supergroup 0 2018-06-10 21:01 /user/hive/warehouse/jimdb.db/emp_test
drwxr-xr-x - hadoop supergroup 0 2018-06-07 15:58 /user/hive/warehouse/jimdb.db/employees
drwxr-xr-x - hadoop supergroup 0 2018-06-02 05:56 /user/hive/warehouse/jimdb.db/employees_external_table
drwxr-xr-x - hadoop supergroup 0 2018-06-12 02:35 /user/hive/warehouse/jimdb.db/family
drwxr-xr-x - hadoop supergroup 0 2018-06-07 23:51 /user/hive/warehouse/jimdb.db/test1
drwxr-xr-x - hadoop supergroup 0 2018-06-10 19:26 /user/hive/warehouse/jimdb.db/udtf_test

從在數據庫jimdb目錄下查看的結果看,表目錄以及數據文件已經完全刪除掉了,所以對於管理表,能夠有效的控制數據的生命周期,管理表和管理分區表在數據倉庫中是應用最多的表類型。

2. 外部表舉例

hive (jimdb)> --外部表
> CREATE EXTERNAL TABLE IF NOT EXISTS department(
> deptno STRING,
> dname STRING,
> loc STRING
> )
> ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
> LOCATION '/data/dept';
OK
Time taken: 0.318 seconds

 

外部表指向的這個目錄下的數據文件內容如下:

hadoop@192-168-178-134:/usr/local/hive/hive-1.2.2/bin$ hadoop fs -cat /data/dept/dept
50 HR XIAN
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON

現在對該表進行查詢:

hive (jimdb)> SELECT * FROM department;;
OK
department.deptno department.dname department.loc
50 HR XIAN
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
Time taken: 0.163 seconds, Fetched: 5 row(s)

可以通過DESC(RIBE) EXTENDED  tablename對外部表的詳細信息進行查看:

 

hive (jimdb)> DESC EXTENDED department;
OK
col_name data_type comment
deptno string 
dname string 
loc string 

Detailed Table Information Table(tableName:department, dbName:jimdb, owner:hadoop, createTime:1528811524, lastAccessTime:0, retention:0, sd:StorageDescriptor(cols:[FieldSchema(name:deptno, type:string, comment:null), FieldSchema(name:dname, type:string, comment:null), FieldSchema(name:loc, type:string, comment:null)], location:hdfs://192.168.178.134:9000/data/dept, inputFormat:org.apache.hadoop.mapred.TextInputFormat, outputFormat:org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat, compressed:false, numBuckets:-1, serdeInfo:SerDeInfo(name:null, serializationLib:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, parameters:{field.delim= , serialization.format=
Time taken: 0.167 seconds, Fetched: 5 row(s)

 

外部表的查詢和管理表時沒有任何區別的,但是在刪除表后,數據文件是不會被刪除掉的,如下:

hive (jimdb)> drop table department;
OK
Time taken: 0.262 seconds

hadoop@192-168-178-134:/usr/local/hive/hive-1.2.2/bin$ hadoop fs -cat /data/dept/dept
50 HR XIAN
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON

外部表已經刪除,但是數據文件沒有受到影響。

3. 外部分區表

外部表也可以使用分區。在定義外部表時,必須定義一個LOCATION子句的數據文件目錄,而對於外部分區表,不需要定義這個LOCATION子句,有一個ALTER TABLE XX ADD PARTITION ....LOCATION....語句在添加分區時定義這個分區的數據文件的目錄。

創建一張某班級月考的學生成績表

hive (jimdb)> CREATE EXTERNAL TABLE IF NOT EXISTS month_grade(
> stu_no INT,
> name STRING,
> grade_sum STRING)
> PARTITIONED BY(year INT,month INT)
> ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
OK
Time taken: 0.371 seconds

hive (jimdb)> ALTER TABLE month_grade ADD PARTITION(year=2018,month=1)
> LOCATION 'hdfs://192.168.178.134:9000/data/2018/1';
OK
Time taken: 0.972 seconds
hive (jimdb)> ALTER TABLE month_grade ADD PARTITION(year=2018,month=2)
> LOCATION 'hdfs://192.168.178.134:9000/data/2018/2';
OK
Time taken: 0.32 seconds
hive (jimdb)> 
> ALTER TABLE month_grade ADD PARTITION(year=2018,month=3)
> LOCATION 'hdfs://192.168.178.134:9000/data/2018/3';
OK
Time taken: 0.289 seconds
hive (jimdb)> 
> ALTER TABLE month_grade ADD PARTITION(year=2018,month=4)
> LOCATION 'hdfs://192.168.178.134:9000/data/2018/4';
OK
Time taken: 0.195 seconds

可以刪除掉分區,但是分區對應的數據不受影響,因為這是外部表的一個分區指向到了數據的路徑。

hive (jimdb)> ALTER TABLE month_grade DROP PARTITION(year=2018,month=4);
OK
Time taken: 0.256 seconds

查看該分區對應的數據文件:

hadoop@192-168-178-134:/usr/local/hive/hive-1.2.2/bin$ hadoop fs -cat /data/2018/4/month_grade4
1000 liuhua 546
1001 dongqign 600
1002 tangtang 549
1003 qigngua 499
1004 liuhua 700
1005 liudongdong 609

數據文件還存在,因此說明外部表的分區的刪除對數據文件沒影響。

要刪除數據文件,可以使用 hadoop fs  -rm -r  /data/2018/4 將這個目錄下的文件都刪除掉;

hadoop@192-168-178-134:/usr/local/hive/hive-1.2.2/bin$ hadoop fs -rmr /data/2018/4/
rmr: DEPRECATED: Please use '-rm -r' instead.
Deleted /data/2018/4

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM