Hive 分區介紹:
hive中簡單介紹分區表(partition table),含動態分區(dynamic partition)與靜態分區(static partition)
hive中創建分區表沒有什么復雜的分區類型(范圍分區、列表分區、hash分區、混合分區等)。
分區列也不是表中的一個實際的字段,而是一個或者多個偽列。意思是說在表的數據文件中實際上並不保存分區列的信息與數據。
分區改變了HIVE 對數據存儲的組織方式,hive 會創建反應分區結構的子目錄,就是那些實際的目錄名稱。
對數據進行分區,最主要的原因就是為了更快的查詢。
可以通過,show partitions 表名 查看表中存在的所有分區,
或者
describe extended 表名
desc 表名
動態分區:
當需要創建非常多的分區的時候,Hive提供了動態分區的功能:
可以基於查詢的參數,推斷出需要創建分區的名稱。
INSERT OVERWRITE TABLE emp PARTITION (country, state) SELECT ..., ... , se.cnty, se.st FROM staged_emp se;
需要注意,字段值和分區之間的關系是根據位置而不是字段名稱來進行匹配的。
動態分區也可以和靜態分區混合使用,但是靜態分區必須出現在動態分區之前。
舉例:使用動態分區要先設置hive.exec.dynamic.partition參數值為true,默認值為false;
動態分區的使用方法很簡單,假設我想向stat_date='20110728'這個分區下面插入數據,至於province插入到哪個子分區下面讓數據庫自己來判斷,那可以這樣寫:
insert overwrite table partition_test partition(stat_date='20110728',province) select member_id,name,province from partition_test_input where stat_date='20110728';
stat_date叫做靜態分區列,province叫做動態分區列。
select子句中需要把動態分區列按照分區的順序寫出來,靜態分區列不用寫出來。這樣stat_date='20110728'的所有數據,會根據province的不同分別插入到/user/hive/warehouse/partition_test/stat_date=20110728/下面的不同的子文件夾下,如果源數據對應的province子分區不存在,則會自動創建,非常方便,
而且避免了人工控制插入數據與分區的映射關系存在的潛在風險。
注意,動態分區不允許主分區采用動態列而副分區采用靜態列,這樣將導致所有的主分區都要創建副分區靜態列所定義的分區:
insert overwrite table partition_test partition(stat_date,province='liaoning') select member_id,name,province from partition_test_input where province='liaoning';
FAILED: SemanticException [Error 10094]: Line 1:49 Dynamic partition cannot be the parent of a static partition ''liaoning''
問題:一般是建表的時候,分區表的順序出現了問題,靜態分區一定要再動態分區的前面。
set hive.exec.dynamic.partition.mode; hive.exec.dynamic.partition.mode=strict
