關於sqoop --split-by 及 -m的理解


 


場景: 

sqoop import --connect jdbc:postgresql://...../..... --username ....  --query "select * from retail_tb_order_qiulp_test where status = 'TRADE_FINISHED' or status = 'TRADE_CLOSED' or status = 'TRADE_CLOSED_BY_TAOBAO' and \$CONDITIONS"  --hive-import -m 6 --hive-table custom_analyse_db.retail_tb_order_main --hive-overwrite --hive-partition-key part --hive-partition-value qiulp --target-dir /user/qiulp/test1 --split-by tid 
注意紅色字體部分, retail_tb_order_qiulp_test表原有1000條數據,導入hive后成了6000條,是map的倍數關系。
如下圖,一條數據在hive中有6條相同的數據: 

理解 
1.split-by 根據不同的參數類型有不同的切分方法,如int型,Sqoop會取最大和最小split-by字段值,然后根據傳入的num-mappers來 確定划分幾個區域。比如select max(split_by),min(split-by) from得到的max(split-by)和min(split-by)分別為1000和1,而num-mappers(-m)為2的話,則會分成兩個區域 (1,500)和(501-1000),同時也會分成2個sql給2個map去進行導入操作,分別為select XXX from table where split-by>=1 and split-by<500和select XXX from table where split-by>=501 and split-by<=1000.最后每個map各自獲取各自SQL中的數據進行導入工作。 

2.當split-by不是int型時出現如上場景中的問題。目前想到的解決辦法是:將-m 設置稱1,split-by不設置,即只有一個map運行,缺點是不能並行map錄入數據。(注意,當-m 設置的值大於1時,split-by必須設置字段) 

3.split-by即便是int型,若不是連續有規律遞增的話,各個map分配的數據是不均衡的,可能會有些map很忙,有些map幾乎沒有數據處理的情況


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM