sqoop export 資料覆蓋更新

loveheping發表於2018-01-15
一、Sqoop export簡介
  Sqoop export工具被用來將檔案集合從HDFS中匯入到關係型資料庫中。目標表必須事先已經在資料庫中建立好。輸入檔案根據使用者指定的分隔符被讀取解析成記錄集。Sqoop預設的是將這些操作轉換成“INSERT模式”,向目標資料庫中注入資料記錄。在“更新模式”中,Sqoop將會產生更新語句替換資料庫中已經存在的記錄。在“呼叫模式”中,Sqoop會為每個記錄產生一個儲存過程呼叫。
1、“INSERT模式”:Sqoop預設將每條記錄以轉換成INSERT語句,新增到資料庫表中,如果你的表存在一些約束如關鍵字唯一等,使用插入模式要當心,避免違反這些約束。如果一條記錄插入失敗那麼,該匯入job將會失敗。這種模式一般用於將資料匯入到一個新的、空的表。Sqoop預設情況下使用INSERT 模式
2、“UPDATE模式”:如果指定--update-key引數,Sqoop將會修改一個資料庫中存在的資料集,每一條記錄都會當做UPDATE語句來修改存在的記錄。記錄的修改語句根據--update-key指定的列決定。如果一個更新語句在資料庫中沒有對應的記錄,則不會報錯,匯出操作會繼續進行。事實上,這意味著不會在資料庫中匯入新的記錄,只是更新原始資料。

二、引數介紹
--update-key 後面也可以接多個關鍵字列名,可以使用逗號隔開,Sqoop將會匹配多個關鍵字後再執行更新操作。
--export-dir 引數配合--table或者--call引數使用,指定了HDFS上需要將資料匯入到MySQL中的檔案集目錄。
--update-mode updateonly和allowinsert。 預設模式為updateonly,如果指定--update-mode模式為allowinsert,可以將目標資料庫中原來不存在的資料也匯入到資料庫表中。即將存在的資料更新,不存在資料插入。

三、組合測試及說明
1、當指定update-key,且關係型資料庫表存在主鍵時:
   A、allowinsert模式時,為更新目標資料庫表存的內容,並且原來不存在的資料也匯入到資料庫表;
   B、updateonly模式時,為更新目標資料庫表存的內容,並且原來不存在的資料也不匯入到資料庫表;
   
2、當指定update-key,且關係型資料庫表不存在主鍵時:
   A、allowinsert模式時,為全部資料追加匯入到資料庫表;
   B、updateonly模式時,為更新目標資料庫表存的內容,並且原來不存在的資料也不匯入到資料庫表;

3、當不指定update-key,且關係型資料庫表存在主鍵時:
   A、allowinsert模式時,報主鍵衝突,資料無變化;
   B、updateonly模式時,報主鍵衝突,資料無變化;

4、當不指定update-key,且關係型資料庫表不存在主鍵時:
   A、allowinsert模式時,為全部資料追加匯入到資料庫表;
   B、updateonly模式時,為全部資料追加匯入到資料庫表;

歡迎大家針對以上案例測試,如存在差錯請指教。

個人建議:使用sqoop向關係型資料庫中匯入資料時,建議在關係型資料庫表中建立主鍵。

若澤大資料交流群:671914634

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31511218/viewspace-2150172/,如需轉載,請註明出處,否則將追究法律責任。

相關文章