zoukankan      html  css  js  c++  java
  • 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 '	' --lines-terminated-by '
    ' -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 ' ' --lines-terminated-by ' '要和导入的一致,否则报错
    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,没有数据就插入,有数据就更新

  • 相关阅读:
    source insight 使用介绍
    android 自定义progressBar
    appium环境安装
    js定义类的三种方法
    对象,函数,构造函数this,原型
    mindjet使用技巧
    在wamp下安装bugfree
    QTP
    powerdesigner使用
    随笔
  • 原文地址:https://www.cnblogs.com/luogankun/p/3895089.html
Copyright © 2011-2022 走看看