sqoop操作之HDFS導出到ORACLE

操作詳情:https://www.cnblogs.com/xiaodf/p/6030102.html

注意:在導出前需要先創建待導出的表結構。如果導出的表在數據庫中不存在則會報錯;如果重複導出多次,表中的數據會重複;

create table EMP_DEMO as select * from EMP where 1=2;
create table SALGRADE_DEMO as select * from SALGRADE where 1=2;

 

導出表的所有字段

sqoop export --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL \
--username SCOTT --password tiger \
--table EMP_DEMO  \
--export-dir /user/hadoop/EMP  -m 1;

 重複執行多次,表中的數據會重複,不會刪除以前存在的數據。

 

導出表的指定字段

爲了查看演示效果方便,先刪除表中已經存在的數據。

DELETE FROM EMP_DEMO;
複製代碼
sqoop export --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL \
--username SCOTT --password tiger \
--table EMP_DEMO  \
--columns "EMPNO,ENAME,JOB,SAL,COMM" \
--export-dir '/user/hadoop/EMP_COLUMN' \
-m 1;

sqoop export --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL \
--username SCOTT --password tiger \
--table EMP_DEMO  \
--columns "EMPNO,ENAME,JOB,SAL,COMM" \
--export-dir '/user/hadoop/EMP' \
-m 1;
複製代碼

 

導出表的指定字段使用指定的分隔符

爲了查看演示效果方便,先刪除表中已經存在的數據。

DELETE FROM EMP_DEMO;
複製代碼
sqoop export --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL \
--username SCOTT --password tiger \
--table EMP_DEMO  \
--columns "EMPNO,ENAME,JOB,SAL,COMM" \
--export-dir '/user/hadoop/EMP_COLUMN_SPLIT' \
--fields-terminated-by '\t' --lines-terminated-by '\n' -m 1;
複製代碼

沒有指定分隔符的腳本在執行時是會報錯的:Caused by: java.lang.NumberFormatException

複製代碼
sqoop export --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL \
--username SCOTT --password tiger \
--table EMP_DEMO  \
--columns "EMPNO,ENAME,JOB,SAL,COMM" \
--export-dir '/user/hadoop/EMP_COLUMN_SPLIT' \
-m 1;
複製代碼

說明:
1)--fields-terminated-by '\t' --lines-terminated-by '\n'要和導入的一致,否則報錯
2)export 命令是不支持覆蓋的,經過上次的兩個導出操作,表裏就有兩份相同的數據了

 

批量導出

爲了查看演示效果方便,先刪除表中已經存在的數據。

DELETE FROM EMP_DEMO;
複製代碼
sqoop export  \
-Dsqoop.export.records.per.statement=10 \
--connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL \
--username SCOTT --password tiger \
--table EMP_DEMO  \
--export-dir /user/hadoop/EMP  -m 1 \
--batch ;
複製代碼

 默認情況下讀取一行HDFS文件的數據就insert一條記錄到關係型數據庫中,性能低下;

可以使用批量導出,一次導入10條數據到關係型數據庫中;

 

導出保證原子性

爲了查看演示效果方便,先刪除表中已經存在的數據。

DELETE FROM EMP_DEMO;
複製代碼
sqoop export   --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL \
--username SCOTT --password tiger \
--table EMP_DEMO  \
--export-dir /user/hadoop/EMP  -m 1 \
--staging-table staging_emp  \
--clear-staging-table ;
複製代碼

map task沒有數據回滾操作,如何保證原子性呢?

sqoop在導出在目標表中,先導入到臨時表中staging_emp,確定導出成功後,再一次性的操作到目標表中,保證原子性;

在使用--staging-table時,staging_emp表必須要事先創建好,而且必須要有主鍵;
如果使用了--clear-staging-table,staging_emp如果存在數據,則先刪除staging_emp表中的數據再導出;

 

處理null數據

複製代碼
sqoop export   --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL \
--username SCOTT --password tiger \
--table EMP_DEMO  \
--export-dir /user/hadoop/EMP  -m 1 \
--input-null-string '\\N' \
--input-null-non-string '\\N' ;
複製代碼

 

update-key操作

create table EMP_DEMO2 as select * from EMP_DEMO where 1=1;

將empno=7788的ename改爲SCOTT11,empno=7782的ename改爲CLARK11

此時hdfs中的empno=7788的ename爲SCOTT,empno=7782的ename爲CLARK

sqoop export --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL \
--username SCOTT --password tiger \
--table EMP_DEMO2  \
--export-dir /user/hadoop/EMP  \
--update-key EMPNO -m 1;

執行完後,發現empno=7788的ename爲SCOTT,empno=7782的ename爲CLARK

將empno=7788的ename改爲SCOTT11,empno=7782的ename改爲CLARK11
表中刪除除了empno爲7788和7782之外的任意數據,再次執行

sqoop export --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL \
--username SCOTT --password tiger \
--table EMP_DEMO2  \
--export-dir /user/hadoop/EMP  \
--update-key EMPNO -m 1;

執行完後,發現表中的數據條數並沒有添加,但是發現empno=7788的ename爲SCOTT,empno=7782的ename爲CLARK

總結:--update-key只更新,不添加

 

update-mode allowinsert操作

EMP_DEMO2表中將empno=7788的ename改爲SCOTT11,empno=7782的ename改爲CLARK11,刪除一些數據,只留下幾條做測試

複製代碼
sqoop export --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL \
--username SCOTT --password tiger \
--table EMP_DEMO2 \
--export-dir /user/hadoop/EMP \
--update-key EMPNO \
--update-mode allowinsert -m 1;
複製代碼

執行完畢後,發現一共有14條數據了,將HDFS中的數據都導出到數據庫中,並更新了empno=7788的ename改爲SCOTT,empno=7782的ename改爲CLARK
再執行一次:

複製代碼
sqoop export --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL \
--username SCOTT --password tiger \
--table EMP_DEMO2 \
--export-dir /user/hadoop/EMP \
--update-key EMPNO \
--update-mode allowinsert -m 1;
複製代碼

還是14條數據沒變;

總結:根據指定的ID,沒有數據就插入,有數據就更新

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章