博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
sqoop操作之HDFS导出到ORACLE
阅读量:6652 次
发布时间:2019-06-25

本文共 3999 字,大约阅读时间需要 13 分钟。

注意:在导出前需要先创建待导出的表结构。如果导出的表在数据库中不存在则会报错;如果重复导出多次,表中的数据会重复;

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,没有数据就插入,有数据就更新

 

转载地址:http://bfjto.baihongyu.com/

你可能感兴趣的文章
知识点记录
查看>>
oracle服务器重启后无法进入系统,登录系统时提示model is unknow
查看>>
action访问spring的两种策略
查看>>
找不到servlet类,报异常java.lang.classnotfoundexception
查看>>
根据字体多少使UILabel自动调节尺寸
查看>>
Discuzee模版社区
查看>>
微信公众号开发简介
查看>>
有人认为“中文编程”是解决中国程序员编程效率的秘密武器,请问它是一个“银弹”吗?...
查看>>
YII 模型model层添加新变量,渲染到视图层
查看>>
dede后台栏目文章问题
查看>>
扩展欧基里德算法模板
查看>>
jqgrid 单元格放超链接文本
查看>>
heartbeat + drbd + nginx
查看>>
UVA458 The Decoder
查看>>
CCF201503-5 最小花费(30分)
查看>>
CCF NOI1145 数字金字塔【DP】
查看>>
HDU5150 Sum Sum Sum
查看>>
UVA11292 HDU1902 POJ3646 The Dragon of Loowater【贪心】
查看>>
python入门知识点(上)
查看>>
ASP.Net页面刷新后自动滚动到原来位置
查看>>