注意:在导出前须要先建立待导出的表结构。若是导出的表在数据库中不存在则会报错;若是重复导出屡次,表中的数据会重复;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,没有数据就插入,有数据就更新;