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

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

sqoop操作之HDFS导出到ORACLE的更多相关文章

  1. sqoop操作之HIVE导出到ORACLE

    示例数据准备 hive中创建dept表 create table dept( deptno int, dname string, loc string ) row format delimited f ...

  2. sqoop 操作从hdfs 导入到mysql中语句

    将hdfs下/dw/dms/usr_trgt下的文件导入到mysql中test数据库下usr_trgt表中 sqoop-export   --connect jdbc:mysql://mysqlDB: ...

  3. Sqoop操作实践

    Sqoop操作实践 @(Hadoop) Sqoop常用参命令 序号 命令/command 类 说明 1 impor ImportTool 从关系型数据库中导入数据(来自表或者查询语句)到HDFS中 2 ...

  4. python基础操作以及hdfs操作

    目录 前言 基础操作 hdfs操作 总结 一.前言        作为一个全栈工程师,必须要熟练掌握各种语言...HelloWorld.最近就被"逼着"走向了python开发之路, ...

  5. 用SQL server导出到oracle,查询时提示“表或视图不存在ORA-00942”错误

    用SQL server2005的导出工具,将数据导出表到oracle,表名称里看到有这张表了,但查询或删除时都提示“ORA-00942表或者试图不存在”的错误,上网查了一下,是如下原因: “查询或删除 ...

  6. 一、导入、导出远程Oracle数据库

    一.导入.导出远程Oracle数据库  其语法实示例如下:    imp/exp [username[/password[@service]]]   其中service是服务实例名,关于如何创建服务实 ...

  7. HDFS shell操作及HDFS Java API编程

    HDFS shell操作及HDFS Java API编程 1.熟悉Hadoop文件结构. 2.进行HDFS shell操作. 3.掌握通过Hadoop Java API对HDFS操作. 4.了解Had ...

  8. mongodb 数据库操作--备份 还原 导出 导入(转)

    mongodb 数据库操作--备份 还原 导出 导入   -------------------MongoDB数据导入与导出------------------- 1.导出工具:mongoexport ...

  9. sqoop定时增量导入导出

    sqoop定时增量导入 2013-11-06 14:23 4553人阅读 评论(0) 收藏 举报 sqoop使用hsql来存储job信息,开启metastor service将job信息共享,所有no ...

随机推荐

  1. UML-(团队作业)

    UML设计 1.团队信息: 队名:异次元 2.团队成员: 姓名 分配任务 王诚荣(队长) 汇总合并,系统活动图 马祎特 好感度系统类图,电子版图片绘制 陈斌 个人中心,闹钟界面用例图,状态图 洪康 后 ...

  2. iOS-----使用CFNetwork实现TCP协议的通信

    使用CFNetwork实现TCP协议的通信 TCP/IP通信协议是一种可靠的网络协议,它在通信的两端各建立一个通信接口,从而在通信的两端之间形成网络虚拟链路.一旦建立了虚拟的网络链路,两端的程序就可以 ...

  3. matlab max()

    max()函数 (1)可以找出矩阵元素中每列的最大值 max(A) ,max(A,[],dim ),带返回值的[C,I]=max(A).[C,I]=max(A,[],dim) max(A,[],dim ...

  4. QT 5.4.1 for Android Ubuntu QtWebView Demo

    QT 5.4.1 for Android Ubuntu QtWebView Demo 2015-5-15 目录 一.说明: 二.参考文章: 三.QtWebView Demo在哪里? 四.Qt Crea ...

  5. opencv-python教程学习系列11-几何变换

    前言 opencv-python教程学习系列记录学习python-opencv过程的点滴,本文主要介绍几何变换,坚持学习,共同进步. 系列教程参照OpenCV-Python中文教程: 系统环境 系统: ...

  6. zzuli2228: 神奇的排名

    题目描述 小明最近沉迷上了打codeforces的比赛,和acm不同的是,这种比赛是积分制的,按照做题用时,错误次数以及hack来计分的.在某一场比赛,共有n个人参加比赛,现在给出你所有人的分数,小明 ...

  7. poj2253 最短路

    题意:青蛙跳石头,给出石头的坐标,然后要确定一条路径,使路径上的最大跨度最小,其实也是一道最短路问题,只要将更新条件从总距离最短改为最大跨度最小就行,即从某点到当前点路径上的最大跨度如果小于当前点原本 ...

  8. test20190320 全连(fc)

    题意 全连(fc) [题目背景] 还记得若干年前那段互相比较<克罗地亚狂想曲>的分数的日子吗? [题目描述] E.Space 喜欢打音游. 但是他技术不好,总是拿不到全连(Full Com ...

  9. gridview 自动序号 合计

    第一种方式,直接在Aspx页面GridView模板列中.这种的缺点是到第二页分页时又重新开始了. <asp:TemplateField HeaderText="序号" Ins ...

  10. 写了一篇关于 FastAdmin 插件路由的分析文章

    写了一篇关于 FastAdmin 插件路由的分析文章 插件路由演示 ThinkPHP 的路由就像是整个应用的调度室,让你的应用 url 更友好,而且让应用更安全,不会让真实的地址暴露出去. 了解过 L ...