1. 程式人生 > >sqoop實現關系型數據庫與hadoop之間的數據傳遞-import篇

sqoop實現關系型數據庫與hadoop之間的數據傳遞-import篇

har 重要性 ise es2017 date 數據遷移 導致 n-k 字符

由於業務數據量日益增長,計算量非常龐大,傳統的數倉已經無法滿足計算需求了,所以現在基本上都是將數據放到hadoop平臺去實現邏輯計算,那麽就涉及到如何將oracle數倉的數據遷移到hadoop平臺的問題。

這裏就不得不提到一個很實用的工具——sqoop,它是一款開源的工具,主要用於實現關系型數據庫與hadoop中hdfs之間的數據傳遞,其中用的最多的就是import,export了。

sqoop的安裝配置也是非常簡單的,這裏就不說明了,本文主要針對如何使用sqoop實現oracle到hive(hdfs)的數據傳遞進行試驗。

對於比較全的參數使用,可以到sqoop的官方文檔http://sqoop.apache.org/docs/ 查看,以下是這次會用到的一些參數講解:

-m N :開啟N個map來導入數據

--query : 從查詢結果導入數據,註意,如果使用了該參數,那麽必須指定--target-dir參數,並且查詢條件中要包含$CONDITIONS

--target-dir :指定數據在HDFS中的存放目錄

--hive-table :導入到hive的目標表名

--fetch-size :一次從數據庫中讀取的記錄數

--hive-drop-import-delims :將數據導入到hive時,去掉其中的\n,\r,\001等特殊字符

--null-string <null-string> :對於string類型的字段,如果值為null,那麽使用<null-string>替代

--non-null-string <non-null-string> :對於非string類型的字段,如果值為null,那麽使用<null-non-string>替代

(通常我們使用的是

--null-string ‘\\N‘ \

--null-non-string ‘\\N’ \

Hive中null默認是使用\N來表示的,如果想要替換成\N,那麽還要多加一個\來轉義)

--hive-partition-key :hive表的分區字段

--hive-partition-value :指定導入到hive表的分區對應的分區值

--hive-overwrite :覆蓋重寫(這裏註意,如果說沒有使用到--hive-partition-key,hive-partition-value,那麽--hive-overwrite的使用會將整個表的數據都覆蓋,反之,則只是覆蓋對應的

某個分區的數據)

--verbose :打印出詳細的信息

================================================================================================

這裏要註意,如果你要導入的數據裏面包含\n,\r,\001之類的特殊字符,那麽要使用--hive-drop-import-delims去掉這些特殊字符,否則,如果字符串中有換行,那麽換行符之後的數據將會被識別為另一行,導致結果不正確。

另一個需要註意的地方,如果導入的數據有些字段值是null的,要加上--null-string,--null-non-string參數,否則,這些null值將會被錯誤的替換為‘null‘這個字符串。

為了更好的說明這幾個參數的重要性,下面來做一下試驗:

平臺說明:

Oracle   Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

Hadoop  hadoop-2.7.2

Hive    hive-2.1.0

Sqoop sqoop-1.4.6

oracle中scott用戶下的數據:

技術分享圖片

說明:empno為7000,8000,9000,9001的記錄中,有的是JOB這個varchar2類型的值為null,有的是MGR這個number類型的值為null,而empno為9002的記錄中,JOB為\nClERK\n(前後都有換行符)。

(1)不使用sqoop的相關參數進行處理:

 1 sqoop import --query "select a.empno,
 2                                a.ename,
 3                                a.job,
 4                                a.mgr,
 5                                a.hiredate,
 6                                a.sal,
 7                                b.deptno,
 8                                b.dname
 9                         from emp_t1 a
10                         left join dept_t1 b 
11                         on a.deptno = b.deptno
12                         where /$CONDITIONS" 13             --connect jdbc:oracle:thin:@192.168.134.200:1521/orclwin 14             --username scott \
15             --password tiger \
16             -m 1 17             --hive-table test_db.emp_t1 \
18             --hive-overwrite \
19             --target-dir /sqoop/emp_t1 \
20             --hive-import 

到hive中查看數據:

技術分享圖片

可見,原來的19條數據導入到hive中之後變成了21條,有兩條是因為empno為9002沒有正確處理其中的換行符導致的一條數據被分割成多條。

而9000和9001這兩條數據的job字段值也不是NULL,而是‘null‘字符串:

技術分享圖片

(2)使用--hive-drop-import-delims參數處理導入數據的特殊符號,--null-string,--null-non-string處理導入數據字段值為空的情況

 1 sqoop import --query "select a.empno,
 2                                a.ename,
 3                                a.job,
 4                                a.mgr,
 5                                a.hiredate,
 6                                a.sal,
 7                                b.deptno,
 8                                b.dname
 9                         from emp_t1 a
10                         left join dept_t1 b 
11                         on a.deptno = b.deptno
12                         where /$CONDITIONS" 13             --connect \ jdbc:oracle:thin:@192.168.134.200:1521/orclwin \
14             --username scott \
15             --password tiger \
16             -m 1 17             --hive-drop-import-delims \
18             --null-string ‘\\N‘ \
19             --null-non-string ‘\\N‘ \
20             --hive-table test_db.emp_t1 \
21             --hive-overwrite \
22             --target-dir /sqoop/emp_t1 \
23             --hive-import

到hive中查看數據:

技術分享圖片

數據導入正常。

好啦,這個import的功能就說到這了,下一篇再說export~

sqoop實現關系型數據庫與hadoop之間的數據傳遞-import篇