sqoop操作之HDFS导出到ORACLE
来源:互联网 发布:string数组添加数据 编辑:程序博客网 时间:2024/05/16 12:49
操作详情:https://www.cnblogs.com/xiaodf/p/6030102.html
注意:在导出前需要先创建待导出的表结构。如果导出的表在数据库中不存在则会报错;如果重复导出多次,表中的数据会重复;
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
- sqoop oracle 到hdfs
- Sqoop HDFS导出到MySQL
- Sqoop 从hdfs中把数据导出到oracle
- SQOOP从HDFS导出数据到MySQL
- Hadoop数据工具sqoop,导入HDFS,HIVE,HBASE,导出到oracle
- 利用SQOOP将ORACLE到HDFS
- 3.sqoop 导入到HDFS,导出到RDBMS
- 利用Sqoop从HDFS导出数据到DB
- 1.5 使用Sqoop从HDFS导出数据到MySQL
- 利用sqoop导出hive数据到 oracle
- sqoop导oracle.mysql数据到hdfs hive
- Sqoop MySQL 导入到HDFS
- Sqoop导入数据到hdfs
- sqoop 导出mysql,oracle
- sqoop--oracle与hdfs互导
- java中的double精度,sqoop从oracle导出到hive
- 从Hive导出数据到Oracle数据库--Sqoop
- java使用jdbc连接mysql数据库
- 关于时间的jquery插件
- Java基础总结
- bzoj3109: [cqoi2013]新数独
- 如何判断一个基本类型的变量的类型呢?
- sqoop操作之HDFS导出到ORACLE
- 剑指15-输出链表中倒数第k个结点
- 那些年重温GreenDao时遇到的坑
- Codeforces492C【模拟】
- Java Bug 6260652 记录
- 【C++】改错题总结
- Jfinal学习日志第一章-快速上手(详细图解)
- nodejs res.end和res.send 区别
- 关于工作