hive中簡單介紹分區表(partition table),含動態分區(dynamic partition)與靜態分區(static partition)sql
hive中建立分區表沒有什麼複雜的分區類型(範圍分區、列表分區、hash分區、混合分區等)。數據庫
分區列也不是表中的一個實際的字段,而是一個或者多個僞列。意思是說在表的數據文件中實際上並不保存分區列的信息與數據。spa
分區改變了HIVE 對數據存儲的組織方式,hive 會建立反應分區結構的子目錄,就是那些實際的目錄名稱。blog
對數據進行分區,最主要的緣由就是爲了更快的查詢。input
能夠經過,show partitions 表名 查看錶中存在的全部分區,string
或者hash
describe extended 表名it
desc 表名io
當須要建立很是多的分區的時候,Hive提供了動態分區的功能:table
能夠基於查詢的參數,推斷出須要建立分區的名稱。
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