sqoop操作之HDFS匯出到ORACLE

來源:互聯網
上載者:User

操作詳情: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,沒有資料就插入,有資料就更新

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.