hive SQL 靜態分區和 動態分區


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

問題:一般是建表的時候,分區表的順序出現了問題,靜態分區一定要再動態分區的前面。 

 

動態分區可以允許所有的分區列都是動態分區列,但是要首先設置一個參數hive.exec.dynamic.partition.mode :
 
set hive.exec.dynamic.partition.mode;
hive.exec.dynamic.partition.mode=strict

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM