關係型數據庫(如Oracle)中,對分區表Insert數據時候,數據庫自動會根據分區字段的值,將數據插入到相應的分區中,Hive中也提供了相似的機制,即動態分區(Dynamic Partition),只不過,使用Hive的動態分區,須要進行相應的配置。node
先看一個應用場景,源表t_lxw1234的數據以下:數據庫
目標表爲:url
需求:將t_lxw1234中的數據按照時間(day),插入到目標表t_lxw1234_partitioned的相應分區中。it
若是按照以前介紹的往指定一個分區中Insert數據,那麼這個需求很不容易實現。io
這時候就須要使用動態分區來實現,使用動態分區須要注意設定如下參數:table
默認值:false配置
是否開啓動態分區功能,默認false關閉。file
使用動態分區時候,該參數必須設置成true;error
默認值:strict數據
動態分區的模式,默認strict,表示必須指定至少一個分區爲靜態分區,nonstrict模式表示容許全部的分區字段均可以使用動態分區。
通常須要設置爲nonstrict
默認值:100
在每一個執行MR的節點上,最大能夠建立多少個動態分區。
該參數須要根據實際的數據來設定。
好比:源數據中包含了一年的數據,即day字段有365個值,那麼該參數就須要設置成大於365,若是使用默認值100,則會報錯。
默認值:1000
在全部執行MR的節點上,最大一共能夠建立多少個動態分區。
同上參數解釋。
默認值:100000
整個MR Job中,最大能夠建立多少個HDFS文件。
通常默認值足夠了,除非你的數據量很是大,須要建立的文件數大於100000,可根據實際狀況加以調整。
默認值:false
當有空分區生成時,是否拋出異常。
通常不須要設置。
那麼,上面的需求可使用以下的語句來完成:
注意:在PARTITION (month,day)中指定分區字段名便可;
在SELECT子句的最後兩個字段,必須對應前面PARTITION (month,day)中指定的分區字段,包括順序。
執行結果以下:
Loading data to table liuxiaowen.t_lxw1234_partitioned partition (month=null, day=null)
Loading partition {month=2015-05, day=2015-05-10}
Loading partition {month=2015-06, day=2015-06-14}
Loading partition {month=2015-06, day=2015-06-15}
Partition liuxiaowen.t_lxw1234_partitioned{month=2015-05, day=2015-05-10} stats: [numFiles=1, numRows=2, totalSize=10, rawDataSize=8]
Partition liuxiaowen.t_lxw1234_partitioned{month=2015-06, day=2015-06-14} stats: [numFiles=1, numRows=2, totalSize=10, rawDataSize=8]
Partition liuxiaowen.t_lxw1234_partitioned{month=2015-06, day=2015-06-15} stats: [numFiles=1, numRows=2, totalSize=10, rawDataSize=8]
使用show partitions t_lxw1234_partitioned;查看目標表有哪些分區:
hive> show partitions t_lxw1234_partitioned;
OK
month=2015-05/day=2015-05-10
month=2015-06/day=2015-06-14
month=2015-06/day=2015-06-15