1. 程式人生 > >【日常工作總結】HIve資料匯入問題

【日常工作總結】HIve資料匯入問題

     最近在BDP平臺上向Hive表中匯入資料時,頻頻出錯,踩過很多坑之後,才發現,原來是是表格式的問題,表格式為OCR,不支援傳統檔案匯入,只支援表與表之間的匯入。藉此機會總結一下hive匯入資料的內容。

資料匯入的幾種方式:

一.從本地檔案系統中匯入資料

hive> LOAD DATA LOCAL INPATH "/home/hadoopUser/data/test1.txt" into table tablename  

二、從HDFS檔案系統載入資料到Hive

hive> LOAD DATA INPATH "/input/test1.txt" into table tablename

備註:LOCAL指的是本地檔案系統,不加LOCAL預設HDFS檔案系統

三.通過查詢語句向表中插入資料

hive> INSERT INTO TABLE test2 SELECT * FROM test1; 

四、分割槽插入

(1) 靜態分割槽插入

建立分割槽表

hive> CREATE TABLE test2(name STRING,address STRING,school STRING)  
    > PARTITIONED BY(age float)  
    > ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'  
    > STORED AS TEXTFILE ;  

此處建立了一個test2的分割槽表,以年齡分割槽

從查詢結果中匯入資料

hive> INSERT INTO  TABLE test2 PARTITION (age='24') SELECT name,address,school FROM test1;  

(2) 動態分割槽插入

靜態分割槽需要建立非常多的分割槽,那麼使用者就需要寫非常多的SQL!Hive提供了一個動態分割槽功能,其可以基於查詢引數推斷出需要建立的分割槽名稱。

 建立分割槽表,此過程和靜態分割槽建立表一樣,此處省略

 引數設定

hive> set hive.exec.dynamic.partition=true;  
hive> set hive.exec.dynamic.partition.mode=nonstrict;  

注意:動態分割槽預設情況下是沒有開啟的。開啟後,預設是以”嚴格“模式執行的,在這種模式下要求至少有一列分割槽欄位是靜態的。這有助於阻止因設計錯誤導致查詢產生大量的分割槽。但是此處我們不需要靜態分割槽欄位,估將其設為nonstrict。

 資料動態插入

hive> insert into table test2 partition (age) select name,address,school,age from test1; 

注意:查詢語句select查詢出來的age欄位必須放在最後,和分割槽欄位對應,不然結果會出錯

注意:若hive表為OCR儲存格式,則不支援檔案匯入方式,需要先匯入臨時表,然後從臨時表匯入目標表。或者刪除OCR表,重新建立新表,匯入亦可。