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

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. XINU安装程序.exe一键配置好XINU实验环境 - imsoft.cnblogs

      还在一步一步配置复杂的XINU吗?XINU安装程序.exe一键配置好XINU实验环境. XINU安装程序.exe使用说明: 本程序配合<网络协议分析与实现>/(胡维华等编著)课本使用 ...

  2. Spring Data Jpa 使用@Query标注自定义查询语句

    https://blog.csdn.net/daniel7443/article/details/51159865 https://blog.csdn.net/pp_fzp/article/detai ...

  3. JQ和JS获取span标签的内容(有的情况下JQ达不到预期的目的就用JS)

    https://www.cnblogs.com/anniey/p/6439021.html <span id="content">‘我是span标签的内容’</s ...

  4. 51Nod1526 分配笔名

    分析 在trie树上贪心,将所有串加入trie树中,在深度较深的地方匹配会更优. 由于只需要知道最后的总质量,所以直接取每个点的子树中最大的匹配即可 复杂度\(O(\sum len)\) 加串的时候把 ...

  5. 在oracle的连接(join)中使用using关键字

    如果是使用natraul join,并且两张表中如果有多个字段是具有相同的名称和数据类型的,那么这些字段都将被oracle自作主张的将他们连接起来. 但实际上我们有时候是不需要这样来连接的.我们只需要 ...

  6. 树莓派挂载和卸载U盘或移动硬盘

    通常我们在 /mnt 或 /media 目录下新建一个目录udisk作为挂载点 sudo mkdir /mnt/udisk 1.手动挂载: 挂载命令: sudo mount -o uid=pi,gid ...

  7. 检索关键字 nyoj

    检索关键字 时间限制: 1000ms 内存限制: 65536KB 64位整型:      Java 类名: 上一题 提交 运行结果 统计 讨论版 下一题 类型: 没有   没有   难度        ...

  8. C++和C#转换

    c#与C++类型转换,网摘2011-12-08 8:33//c++:HANDLE(void   *)          ----    c#:System.IntPtr       //c++:Byt ...

  9. FastDFS 环境搭建

    原文地址:FastDFS 环境搭建 博客地址:http://www.extlight.com 一.前言 最近闲下来,整理了一下笔记,今天就分享一下 FastDFS 环境搭建吧. 二.介绍 2.1 Fa ...

  10. 虚拟机设置成桥接模式x86_openwrt也可以上网

    一.虚拟机桥接设置 1. 2.选择 虚拟机 >>设置 三.ip设置,要在同一网段,能够分配到路由的ip地址 1.主机ip 2.虚拟机中x86_openwrt ip 四.openwrt设置 ...