sqoop實現關系型數據庫與hadoop之間的數據傳遞-import篇
由於業務數據量日益增長,計算量非常龐大,傳統的數倉已經無法滿足計算需求了,所以現在基本上都是將數據放到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篇