注意:在導出前須要先建立待導出的表結構。若是導出的表在數據庫中不存在則會報錯;若是重複導出屢次,表中的數據會重複;java
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;
重複執行屢次,表中的數據會重複,不會刪除之前存在的數據。oracle
導出表的指定字段oop
爲了查看演示效果方便,先刪除表中已經存在的數據。性能
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;
導出表的指定字段使用指定的分隔符測試
爲了查看演示效果方便,先刪除表中已經存在的數據。spa
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.NumberFormatExceptioncode
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 命令是不支持覆蓋的,通過上次的兩個導出操做,表裏就有兩份相同的數據了。orm
批量導出blog
爲了查看演示效果方便,先刪除表中已經存在的數據。
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,沒有數據就插入,有數據就更新;