1. 程式人生 > >Hive之管理表 外部表 分割槽表

Hive之管理表 外部表 分割槽表

一Hive 建立表的三種方式

1.1普通建立

1.2查詢語句建立

CREATETABLE IF NOT EXISTS ext_1 AS SELECT deptno,dname,loc FROMdept;


1.3like建立

CREATETABLE IF NOT EXISTS ext_like like emp;


二 內部表與外部表的比較

Hive表概念和關係型資料庫表概念差不多。在Hive裡表會和HDFS的一個目錄相對應,這個目錄會存放表的資料。目錄預設是/usr/

hive/warehouse/.比如你在hadoop09資料庫建立了emp表,那麼HDFS

/user/hive/warehouse/hadoop09.db/emp就會有這個目錄來存放表裡的資料。

管理表:管理表又被稱之為內部表,他只管理著資料生命週期,當我們刪除這張表時,元資料和真是儲存的資料都會被刪除,也就是說HDFS所對應的表目錄應該被刪除。

管理表有一個缺點:就是不方便和其他工作共享資料。

現在有幾個問題:

1多個人同時在使用這張表,然後某個人不小心,把表刪掉了,其他人都用不了了。

2其他工具產生的資料在某個HDFS某個目錄,但是Hive想去查詢這些資料,但是並沒有給Hive資料所有權。

因此,hive裡就提供瞭如果資料被多個工具共享,我們可以建立外部表

外部表:刪除該表時,只會刪除元資料資訊,但是不會刪除真正的資料。也就是說外部表資料並不是由他自己管理的。

CREATEEXTERNAL TABLE dept_external(

    deptno int,

    dname string,

    loc string

)

ROWFORMAT DELIMITED FIELDS TERMINATED BY '\t'

LOCATION'/user/hive/warehouse/hadoop09.db/dept';

LOCATION:告訴Hive資料位於什麼路徑

三 分割槽表作用以及如何建立,更改

一般情況下,Hive 一個簡單的查詢會掃描整張表,對一張大表而言,會降低效能,我們可以使用分割槽來解決,他也是類似於關係型資料庫表的分割槽。

在Hive裡分割槽都適合預定義的列相關的,作為子目錄存在於在表的目錄裡。當表查詢時,WHERE子句裡的謂詞就是分去過濾器,然後只查詢相關的分割槽的資料返回,而不是查詢整個表。

首先,我們建立一個分割槽表:


然後新增分割槽

ALTERTABLE emp_partition ADD IF NOT EXISTS PARTITION (country='America',state='CA');

ALTERTABLE emp_partition ADD IF NOT EXISTS PARTITION (country='Canada',state='MH');

這時候,HDFS就會新增這樣的2個目錄

/user/hive/warehouse/hadoop09.db/emp_partition/country=America/state=CA

http://hadoop09-/user/hive/warehouse/hadoop09.db/emp_partition/country=Canada/state=MH

我們也可以指定partition在不在表這個目錄裡。

ALTERTABLE emp_partition ADD IF NOT EXISTS PARTITION (country='China',state='BJ')LOCATION '/locate/partition';

我麼這時候查詢分割槽情況:

showpartitions emp_partition;

 

四 如何向分割槽表載入資料

loaddata local inpath '/opt/software/hive/emp.txt' into table emp_partition

partition(country='America',state='CA'); 


loaddata local inpath '/opt/software/hive/emp.txt' into table emp_partition

partition(country='China',state='BJ'); 


然後我們去檢查/locate/partition是否有資料呢?

有資料吧。


五 如何檢索分割槽表資料

在新增分割槽之後,表裡的欄位會增加對應的虛擬欄位,以供查詢使用。

比如我們上面的例子,就會增加country和 state兩個欄位。

SELECT* FROM emp_partition WHERE country='China';