標籤:style blog color java 使用 io strong 檔案
注意:在匯出前需要先建立待匯出的表結構。如果匯出的表在資料庫中不存在則會報錯;如果重複匯出多次,表中的資料會重複;
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,沒有資料就插入,有資料就更新;