您好,登錄后才能下訂單哦!
小編給大家分享一下運用sqoop將數據從oracle導入到hive中有哪些坑,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
1.選擇個別列來進行導入 使用--columns參數即可
2.指定符合條件的數據 使用 --where參數即可,可以使用oracle中的參數,比如我就使用了to_date('2013-06-20','yyyy-MM-dd')函數來指定日期導入
3.sqoop中指定列分隔符 使用 --fields-terminated-by參數即可
4.文件存放位置的指定 使用--target-dir參數即可,不過文件夾是sqoop自己新建的,已存在的話會報異常。有時分了好幾次任務,想導入到同一個文件夾,可使用 --append參數。不用擔心兩次任務會生成同名的文件從而導致失敗,因為當你加入--append參數時,sqoop會先在當前用戶目錄下生成臨時的 文件夾來存放運行結果,然后根據你指定的存放位置,再將結從臨時文件夾剪切到你所指定的文件夾,他會自動更改文件名從而避免重復。
5.想啟動多個map任務運行 一般而言直接使用--m參數即可,他會默認根據你所導入表的主鍵來進行分片,也就是他默認使用--split-by 你的主鍵 來進行分片, 過程就是取你的主鍵的最大值和最小值,然后用獲得的差值來除以你所設的map任務數,這樣會得到每個map任務所處理的數據范圍。 看起來很美妙,其實中間有許多不足,首先你若沒有主鍵,則你必須手動指定--split-by參數,或者你不進行并行執行任務,設置-m 1 。還有的不足就是此次遇到的數據傾斜問題,比如我設置-m 4,可我的主鍵比如最小值1000,最大值10000,可我只有100條數據,其中大部分都分布在主鍵范圍為1000~2000的區域,這下四個map任務分別對應的區間大概為1000~3250,3250~5500,5500~7750,7750~10000。可見,數據 集中在第一個map任務上,其余三個完全沒有數據,這樣非但沒有并行執行的速度,一定程度上還有影響速度。所以split-by如何選擇,要根據實際情況來選擇。
6.如何用date類型的列來作為split-by參數值 此次任務我發現還是使用date類型的列作為分片值比較均勻,可當我直接使用--split-by 我的日期列 的時候,報錯 java.sql.SQLDataException: ORA-01861: literal does not match format string 網上google得知,大意是一個版本bug 解決方案大致為轉換成string類型即可,網址為 https://issues.apache.org/jira/browse/SQOOP-1946。我的解決方案為 --split-by "to_char(我的日期列,'yyyy-MM-dd')"
7.導入的列有換行符如何解決 本以為萬事大吉,萬萬沒想到導入的列有nclob類型,里面存儲了一篇篇文章,勢必有著換行符。果不其然,hive查詢數據全部錯亂, 查詢資料發現--hive-delims-replacement(替換\n,\r等符號用你指定的字符)和--hive-drop-import-delims參數。可添加上去發現并沒有什么卵用,沒有起作用。百度goole很久,終于發現一篇帖子,http://stackoverflow.com/questions/28076200/hive-drop-import-delims-not-removing-newline-while-using-hcatalog-in-sqoop 意思是要用--map-column-java參數來顯示指定列為String類型。我的解決方案為 --map-column-java 我的CLOB列=String 果然,問題解決,換行符全部被去掉。
看完了這篇文章,相信你對“運用sqoop將數據從oracle導入到hive中有哪些坑”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。