1. 程式人生 > >hive外部表建立分割槽,並根據分割槽進行查詢

hive外部表建立分割槽,並根據分割槽進行查詢

1. hive建立外部表

建立外部表的好處:

hive建立外部表時,僅記錄資料所在的路徑,不對資料的位置做任何改變.
刪除表的時候,外部表只刪除元資料,不刪除資料

所以總結起來就是 : 外部表相對安全,資料組織更加靈活,方便共享源資料

建表語法

 CREATE EXTERNAL TABLE IF NOT EXISTS 表名
(
	列名1 資料型別,
            .
            .
            .
            .
            
	列名n 資料型別
)
PARTITIONED BY (分割槽依據 資料型別)
ROW FORMAT DELIMITED
	FIELDS TERMINATED BY '\t' -- 指定資料之間的分隔符
	COLLECTION ITEMS TERMINATED BY '\002'
	MAP KEYS TERMINATED BY '\003'
	LINES TERMINATED BY '\n' -- 指定換行符
LOCATION 'hdfs資料目錄'; -- 載入的hdfs資料目錄

舉例 :

CREATE EXTERNAL TABLE IF NOT EXISTS outhighsampleTest1115xmr
(
	Column_1 SMALLINT,
            .
            .
            .
            .
    -- 列數太多,中間的列省略掉
    
	Column_111 STRING
)
PARTITIONED BY (hour_p int)
ROW FORMAT DELIMITED
	FIELDS TERMINATED BY '\t'
	COLLECTION ITEMS TERMINATED BY '\002'
	MAP KEYS TERMINATED BY '\003'
	LINES TERMINATED BY '\n'
LOCATION '/mt_wlyh/Data/BeiJing/mroxdrmerge/mro_loc/data_01_180125_bak/tb_mr_outsample_high_dd_180125/';

2. 為外部表新增分割槽

為什麼需要分割槽?

舉例 : 一個表裡儲存了一天的資料,但是很多時候,我們只想查詢其中的一個小時
而為了這一個小時的資料取掃描全表,是相當耗時的操作
因此,我們建表的時候指定partition
就可以在後續的應用的過程中為表格新增合適的分割槽

分割槽語法

alter table 表名 add partition (分割槽依據='分割槽名') location 'hdfs路徑';
-- 注意 : 這裡的分割槽依據要和建表時指定的分割槽依據保持一致

舉例 :
TIM圖片20181115200234.png

在我之前建表引入的hdfs目錄下,有5個子目錄,我就以這5個子目錄來建立分割槽

語句如下:

alter table outhighsampleTest1115xmr add partition (hour_p='01') location '/mt_wlyh/Data/BeiJing/mroxdrmerge/mro_loc/data_01_180125_bak/tb_mr_outsample_high_dd_180125/01';

alter table outhighsampleTest1115xmr add partition (hour_p='02') location '/mt_wlyh/Data/BeiJing/mroxdrmerge/mro_loc/data_01_180125_bak/tb_mr_outsample_high_dd_180125/02';

alter table outhighsampleTest1115xmr add partition (hour_p='03') location '/mt_wlyh/Data/BeiJing/mroxdrmerge/mro_loc/data_01_180125_bak/tb_mr_outsample_high_dd_180125/03';

alter table outhighsampleTest1115xmr add partition (hour_p='04') location '/mt_wlyh/Data/BeiJing/mroxdrmerge/mro_loc/data_01_180125_bak/tb_mr_outsample_high_dd_180125/04';

alter table outhighsampleTest1115xmr add partition (hour_p='05') location '/mt_wlyh/Data/BeiJing/mroxdrmerge/mro_loc/data_01_180125_bak/tb_mr_outsample_high_dd_180125/05';

3. 通過分割槽進行查詢

首先查詢分割槽表的分割槽狀態

語法 : show partitions 表名;
舉例 : show partitions outhighsampleTest1115xmr;

TIM圖片20181115200916.png

查詢

    分割槽表進行查詢和普通的hql 沒什麼區別的!
    
    如下圖所示 :
    支援通過分割槽進行的 
    =, != , > < , in, 以及組合查詢!!
    能有效的提高查詢效率

TIM圖片20181115201313.png

4.幾個坑

1.建表時報錯

2. 為表格新增分割槽失敗 
報錯資訊 : Error while compiling statement: FAILED: ValidationFailureSemanticException 
table is not partitioned but partition spec exists: {hour_p=05}

TIM圖片20181115201822.png

報錯資訊含義 : 建立分割槽失敗,表格並不是一個分割槽表

解決方法 :  在建表時指定表格為分割槽表
指定方式建表語句加上 PARTITIONED BY (分割槽依據 資料型別)
即可為該表建立分割槽!

5. 軟體安利

Aginity Workbench for Hadoop

用該軟體來操作hdfs和hive簡直不要太方便!

舉例 :  我想建立一個hdfs上檔案到hive的外部表對映,但是這個hdfs檔案裡面有很多列,敲起來累死人, 而且語法也記不住怎麼辦? 
沒關係,該軟體幫你輕鬆解決!! 

點選Tools–>FileShells–>Hdfs File Explorer
TIM圖片20181115203006.png

設定好hdfs連線,選擇好檔案點選Create Hive Table

TIM圖片20181115203355.png

 點選select-->設定好hive連線和埠號--> OK

TIM圖片20181115203721.png
接下來,點選next進行設定, 在修改下表名什麼的,就OK啦
TIM圖片20181115204045.png

.... 最後,這個語句會出現在窗口裡,點選下execute執行就建立成功了!!!   操作熟練後只是點幾下滑鼠,我們想要的表就出來了


當然,這只是這款軟體的一個小功能而已,還有更多很好的,實用的功能,用過的都說好~~~