1. 程式人生 > >hive 分割槽partition表 建立 資料匯入(動態分割槽插入、靜態分割槽插入、動靜態混合插入)

hive 分割槽partition表 建立 資料匯入(動態分割槽插入、靜態分割槽插入、動靜態混合插入)

學習《hive 程式設計指南》一書,整理的知識,所以文章例子出自此書。

分割槽建立與資料匯入的步驟:

1.建立分割槽表(以外部分割槽表為例)

      create external table if not exists dividends(

        ymd string,

        dividend string)

     partitioned by (ex_change string,symbol string)

     row format delimited fields terminated by ',';

2.建立還有分割槽表字段與分割槽欄位的內部表(管理表)

內部表

內部表的欄位應該包含紅色欄位,建表略

3.將資料匯入2中建立的表。load data……

4.通過內部表靜態或者動態將資料插入分割槽表

非常重要的動態分割槽屬性:

hive.exec.dynamic.partition  是否啟動動態分割槽。false(不開啟) true(開啟)預設是 false

hive.exec.dynamic.partition.mode  開啟動態分割槽後,動態分割槽的模式,有 strict nonstrict 兩個值可選,strict 要求至少包含一個靜態分割槽列,nonstrict則無此要求。各自的好處,大家自己檢視哈。

hive.exec.max.dynamic.partitions 允許的最大的動態分割槽的個數。可以手動增加分割槽。預設1000

hive.exec.max.dynamic.partitions.pernode 一個 mapreduce job所允許的最大的動態分割槽的個數。預設是100

在進行動態分割槽插入時,經常會因為這些配置引數的值報錯,所以習慣檢視日誌明確錯誤。我遇到的報錯資訊:

Caused by: org.apache.hadoop.hive.ql.metadata.HiveFatalException: [Error 20004]: Fatal error occurred when node tried to create too many dynamic partitions. The maximum number of dynamic partitions is controlled by hive.exec.max.dynamic.partitions and hive.exec.max.dynamic.partitions.pernode. Maximum was set to: 100


表名由於分割槽數量超值,所以通過修改引數值就能夠避免這樣的錯誤了。


1)靜態插入資料


注意:方框中的欄位位置以及個數一定要與分割槽表(dividends)的欄位位置以及個數相符合,否則會報出類似如下的錯誤

FAILED: SemanticException [Error 10044]: Line 1:23 Cannot insert into target table because column number/types are different 'symbol': Table insclause-0 has 3 columns, but query has 4 columns.

從上面錯誤提示看出,查詢的表有4列,而目標表格(也就是需要插入資料的表格)有3列,由於列的數目不一樣,導致了上面的語句不能成功執行,所以我們需要保證查詢結果列的數目和需要插入資料表格的列數目一致。

2)動靜態混合分割槽插入


截圖有錯誤資訊,相信大家知道這是什麼原因了吧!!!

一定要注意動態分割槽引數值以及1)的注意事項

3)動態分割槽插入


截圖中的報錯!!是配置引數值問題哦!

有什麼問題請大家指教,本人初學 hive!內容中有借鑑部分。