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';