hive SQL 靜態分區和 動態分區

Hive 分區介紹:

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

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

 

動態分區能夠容許全部的分區列都是動態分區列,可是要首先設置一個參數hive.exec.dynamic.partition.mode :
 
set hive.exec.dynamic.partition.mode;
hive.exec.dynamic.partition.mode=strict
相關文章
相關標籤/搜索