小編給大家分享一下運用sqoop將數(shù)據(jù)從oracle導(dǎo)入到hive中有哪些坑,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
成都創(chuàng)新互聯(lián)是一家從事企業(yè)網(wǎng)站建設(shè)、成都做網(wǎng)站、成都網(wǎng)站制作、行業(yè)門戶網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計制作的專業(yè)網(wǎng)絡(luò)公司,擁有經(jīng)驗豐富的網(wǎng)站建設(shè)工程師和網(wǎng)頁設(shè)計人員,具備各種規(guī)模與類型網(wǎng)站建設(shè)的實力,在網(wǎng)站建設(shè)領(lǐng)域樹立了自己獨特的設(shè)計風(fēng)格。自公司成立以來曾獨立設(shè)計制作的站點上千多家。
1.選擇個別列來進行導(dǎo)入 使用--columns參數(shù)即可
2.指定符合條件的數(shù)據(jù) 使用 --where參數(shù)即可,可以使用oracle中的參數(shù),比如我就使用了to_date('2013-06-20','yyyy-MM-dd')函數(shù)來指定日期導(dǎo)入
3.sqoop中指定列分隔符 使用 --fields-terminated-by參數(shù)即可
4.文件存放位置的指定 使用--target-dir參數(shù)即可,不過文件夾是sqoop自己新建的,已存在的話會報異常。有時分了好幾次任務(wù),想導(dǎo)入到同一個文件夾,可使用 --append參數(shù)。不用擔(dān)心兩次任務(wù)會生成同名的文件從而導(dǎo)致失敗,因為當你加入--append參數(shù)時,sqoop會先在當前用戶目錄下生成臨時的 文件夾來存放運行結(jié)果,然后根據(jù)你指定的存放位置,再將結(jié)從臨時文件夾剪切到你所指定的文件夾,他會自動更改文件名從而避免重復(fù)。
5.想啟動多個map任務(wù)運行 一般而言直接使用--m參數(shù)即可,他會默認根據(jù)你所導(dǎo)入表的主鍵來進行分片,也就是他默認使用--split-by 你的主鍵 來進行分片, 過程就是取你的主鍵的最大值和最小值,然后用獲得的差值來除以你所設(shè)的map任務(wù)數(shù),這樣會得到每個map任務(wù)所處理的數(shù)據(jù)范圍。 看起來很美妙,其實中間有許多不足,首先你若沒有主鍵,則你必須手動指定--split-by參數(shù),或者你不進行并行執(zhí)行任務(wù),設(shè)置-m 1 。還有的不足就是此次遇到的數(shù)據(jù)傾斜問題,比如我設(shè)置-m 4,可我的主鍵比如最小值1000,最大值10000,可我只有100條數(shù)據(jù),其中大部分都分布在主鍵范圍為1000~2000的區(qū)域,這下四個map任務(wù)分別對應(yīng)的區(qū)間大概為1000~3250,3250~5500,5500~7750,7750~10000??梢姡瑪?shù)據(jù) 集中在第一個map任務(wù)上,其余三個完全沒有數(shù)據(jù),這樣非但沒有并行執(zhí)行的速度,一定程度上還有影響速度。所以split-by如何選擇,要根據(jù)實際情況來選擇。
6.如何用date類型的列來作為split-by參數(shù)值 此次任務(wù)我發(fā)現(xiàn)還是使用date類型的列作為分片值比較均勻,可當我直接使用--split-by 我的日期列 的時候,報錯 java.sql.SQLDataException: ORA-01861: literal does not match format string 網(wǎng)上google得知,大意是一個版本bug 解決方案大致為轉(zhuǎn)換成string類型即可,網(wǎng)址為 https://issues.apache.org/jira/browse/SQOOP-1946。我的解決方案為 --split-by "to_char(我的日期列,'yyyy-MM-dd')"
7.導(dǎo)入的列有換行符如何解決 本以為萬事大吉,萬萬沒想到導(dǎo)入的列有nclob類型,里面存儲了一篇篇文章,勢必有著換行符。果不其然,hive查詢數(shù)據(jù)全部錯亂, 查詢資料發(fā)現(xiàn)--hive-delims-replacement(替換\n,\r等符號用你指定的字符)和--hive-drop-import-delims參數(shù)。可添加上去發(fā)現(xiàn)并沒有什么卵用,沒有起作用。百度goole很久,終于發(fā)現(xiàn)一篇帖子,http://stackoverflow.com/questions/28076200/hive-drop-import-delims-not-removing-newline-while-using-hcatalog-in-sqoop 意思是要用--map-column-java參數(shù)來顯示指定列為String類型。我的解決方案為 --map-column-java 我的CLOB列=String 果然,問題解決,換行符全部被去掉。
看完了這篇文章,相信你對“運用sqoop將數(shù)據(jù)從oracle導(dǎo)入到hive中有哪些坑”有了一定的了解,如果想了解更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!