sqoop操作之HDFS导出到ORACLE

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

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

时间: 2024-08-29 12:37:53

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

sqoop操作之HIVE导出到ORACLE

示例数据准备 hive中创建dept表 create table dept( deptno int, dname string, loc string ) row format delimited fields terminated by '\t' lines terminated by '\n' stored as textfile; 导入数据: sqoop import --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL \ --usern

sqoop操作之Oracle导入到HDFS

导入表的所有字段 sqoop import --connect jdbc:oracle:thin:@192.168.1.100:1521:ORCL \ --username SCOTT --password tiger \ --table EMP -m 1; 查看执行结果: hadoop fs -cat /user/hadoop/EMP/part-m-00000 7369,SMITH,CLERK,7902,1980-12-17 00:00:00.0,800,null,20 7499,ALLEN,

sqoop操作之ORACLE导入到HIVE

导入表的所有字段 sqoop import --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL \ --username SCOTT --password tiger \ --table EMP \ --hive-import --create-hive-table --hive-table emp -m 1; 如果报类似的错: ERROR tool.ImportTool: Encountered IOException running imp

sqoop从hdfs导出到mysql

create database logs; use logs create table weblogs_from_hdfs( md5 varchar(32), url varchar(64), request_date date, request_time time, ip varchar(15)); sqoop export -m 1 --connect jdbc:mysql://hadoop:3306/logs --username root --password root --table

sqoop操作之ETL小案例

Extraction-Transformation-Loading的缩写,中文名称为数据提取.转换和加载.将数据从ORACLE中抽取数据,经过hive进行分析转换,最后存放到ORACLE中去. 本案例是纯demo级别,练手使用 一.需求将emp和dept表的数据分析最后存放到result表. emp和dept表均为oracle自带的表,表结构如下: emp表 EMPNO NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIRE

sqoop从关系库导出数据到hive

[Author]: kwu sqoop从关系库导出数据到hive,sqoop支持条件查询关系库中的数到hive数据仓库中,并且字段无须与hive表中的字段一致. 具体实现的脚本: #!/bin/sh # upload logs to hdfs today=`date --date='0 days ago' +%Y-%m-%d` sqoop import --connect jdbc:mysql://10.130.2.6:3306/bdc_test --username lvwenjuan --p

Powershell管理系列(二十六)PowerShell操作之批量导出&导入邮箱

-----提供AD\Exchange\Lync\Sharepoint\CRM\SC\O365等微软产品实施及外包,QQ:185426445.电话18666943750 项目中有时候做跨林邮箱迁移的时候,条件不成熟,比如安全考虑或者其他考虑,不能做双林信任,这样就提出了一个问题,历史邮件需要使用的话怎么办,一个简单高效的解决办法就是从源森林批量导出邮件为.pst文件,在批量导入到目的域森林,具体操作如下: 1.赋予管理账号邮件导入导出权限,命令如下: cls whoami New-Manageme

Oracle Bigdata Connector实战1: 使用Oracle Loader加载HDFS文件到Oracle数据库

部署jdk/Hadoop/OraLoader软件包 将准备好的软件包,逐一解压到hadoop用户home目录下: hadoop-2.6.2.tar.gz jdk-8u65-linux-x64.gz oraloader-3.4.0.x86_64.zip Hadoop软件部署如下: ├── hadoop-2.6.2 ├── jdk1.8.0_65 ├── oraloader-3.4.0-h2 设置环境变量 export JAVA_HOME=/home/hadoop/jdk1.8.0_65 expor

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

一.导入.导出远程Oracle数据库  其语法实示例如下:    imp/exp [username[/password[@service]]]   其中service是服务实例名,关于如何创建服务实例名或者数据库SID在http://blog.sina.com.cn/s/blog_7ffb8dd501013e5v.html有记录 或者: imp/exp [username[/password[@hostIp:1521/DBsid]]]  DBsid是数据库sid   如:exp admin/[