zoukankan      html  css  js  c++  java
  • 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,SALESMAN,7698,1981-02-20 00:00:00.0,1600,300,30
    7521,WARD,SALESMAN,7698,1981-02-22 00:00:00.0,1250,500,30
    7566,JONES,MANAGER,7839,1981-04-02 00:00:00.0,2975,null,20
    ……

    说明:
    1)默认导入到HDFS的路径是:/user/hadoop(用户名)/EMP (表名),如果EMP目录已经存在,则报错
    需要先删除已经存在的目录:hadoop fs -rmr /user/hadoop/EMP;
    如果相同的命令导入多次,也会报错的,需要先删除已经存在的目录;
    2)-m 1表示使用几个map任务处理,sqoop默认采用4个map任务,有几个任务在HDFS的执行结果中就有几个part-m;
    3)sqoop默认从数据库导入到HDFS的分隔符是逗号
    4)空列的值使用null
    5)sqoop中的map数设置原则:一个表的数据抽取不超过3分钟,否则就增加map数;

      

    导入表的指定字段并指定目标地址

    sqoop import --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL 
    --username SCOTT --password  tiger 
    --table EMP  
    --columns "EMPNO,ENAME,JOB,SAL,COMM" 
    --target-dir EMP_COLUMN  -m 1;

    查看执行结果:

    hadoop fs -cat /user/hadoop/EMP_COLUMN/part-m-00000

    7369,SMITH,CLERK,800,null
    7499,ALLEN,SALESMAN,1600,300
    7521,WARD,SALESMAN,1250,500
    7566,JONES,MANAGER,2975,null
    7654,MARTIN,SALESMAN,1250,1400
    ......

    说明:
    1)通过--target-dir指定导入到HDFS的具体位置
    2)通过--columns指定需要导入的列

    导入表的指定字段并指定目标地址使用指定的分隔符 

    sqoop import --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL 
    --username SCOTT --password tiger 
    --table EMP  
    --columns "EMPNO,ENAME,JOB,SAL,COMM" 
    --target-dir EMP_COLUMN_SPLIT 
    --fields-terminated-by '	' --lines-terminated-by '
    ' 
    --null-string '' --null-non-string '0'  -m 2;

    查看执行结果:

    hadoop fs -ls /user/hadoop/EMP_COLUMN_SPLIT

    /user/hadoop/EMP_COLUMN_SPLIT/_SUCCESS       
    /user/hadoop/EMP_COLUMN_SPLIT/_logs          
    /user/hadoop/EMP_COLUMN_SPLIT/part-m-00000   
    /user/hadoop/EMP_COLUMN_SPLIT/part-m-00001  
    
    hadoop fs -cat /user/hadoop/EMP_COLUMN_SPLIT/part-m-00001
    7654    MARTIN  SALESMAN        1250    1400
    7698    BLAKE   MANAGER 2850    0
    7782    CLARK   MANAGER 2450    0
    7788    SCOTT   ANALYST 3000    0
    7839    KING    PRESIDENT       5000    0
    7844    TURNER  SALESMAN        1500    0

    由于这里使用了2个map任务,所以在hdfs的文件中就有了2个part; 由于COMM是NUMBER类型,所以HDFS中就是0。
    说明:
    1)--null-string '': 当string类型的字段为空时,使用''代替
    2)--null-non-string 0 : 当非string类型的字段为空时,使用0代替,项目中不常使用这个配置。
    3)--fields-terminated-by ' ':字段之间采用tab分隔
    4)--lines-terminated-by ' ':行之间采用回车分隔

      

    根据条件导入数据

    sqoop import --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL 
    --username SCOTT --password tiger 
    --table EMP  
    --columns "EMPNO,ENAME,JOB,SAL,COMM" 
    --target-dir EMP_COLUMN_WHERE 
    --fields-terminated-by '	' --lines-terminated-by '
    ' 
    --where 'SAL>2000' 
    --null-string '' --null-non-string '0'  -m 1 ;

    查看执行结果:

    hadoop fs -cat /user/hadoop/EMP_COLUMN_WHERE/part-m-00000

    7566 JONES MANAGER 2975 0
    7698 BLAKE MANAGER 2850 0
    7782 CLARK MANAGER 2450 0
    7788 SCOTT ANALYST 3000 0
    7839 KING PRESIDENT 5000 0
    7902 FORD ANALYST 3000 0

      

    保护数据库密码方式 

    sqoop import --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL 
    --username SCOTT  
    --target-dir EMP_COLUMN_PASSWORD1 
    --table EMP -m 1 
    -P;

      Enter password:

     在执行时通过命令行交互的方式输入密码;

    sqoop import --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL 
    --username SCOTT 
    --table EMP 
    --target-dir EMP_COLUMN_PASSWORD2 
    --password-file /home/hadoop/my-sqoop-password  -m 1 ;

     可以将密码放置到一个文件中,并且设置这个文件只针对某些人可读、可写权限,也能起到密码安全的作用;

    更改导入文件格式

    sqoop import --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL 
    --username SCOTT --password tiger 
    --table EMP -m 1 
    --target-dir EMP_SEQUENCEFILE 
    --as-sequencefile ;
    
    
    sqoop import --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL 
    --username SCOTT --password tiger 
    --table EMP -m 1 
    --target-dir EMP_AVRODATAFILE 
    --as-avrodatafile  ;

    增量数据导入

    sqoop import --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL 
    --username SCOTT --password tiger 
    --table EMP -m 1 
    --target-dir EMP_APPEND 
    --incremental append 
    --check-column EMPNO 
    --last-value 7788  ;

    只导入数据 empno>7788(并不包括7788)的数据,可实现增量导入

    查看执行结果:hadoop fs -cat /user/hadoop/EMP_APPEND/part-m-00000

    7839,KING,PRESIDENT,null,1981-11-17,5000,null,10
    7844,TURNER,SALESMAN,7698,1981-09-08,1500,0,30
    7876,ADAMS,CLERK,7788,1987-05-23,1100,null,20
    7900,JAMES,CLERK,7698,1981-12-03,950,null,30
    7902,FORD,ANALYST,7566,1981-12-03,3000,null,20
    7934,MILLER,CLERK,7782,1982-01-23,1300,null,10

    导入没有主键的表到HDFS中

    以上的案例导出的表是有主键的,下面来演示一个没有主键的表的导出操作。以表SALGRADE为例

    sqoop import --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL 
    --username SCOTT --password tiger 
    --table SALGRADE  
    --target-dir SALGRADE 
    --fields-terminated-by '	' --lines-terminated-by '
    ' 
    --null-string '' --null-non-string '0'  -m 2;

    报错:
    ERROR tool.ImportTool: Error during import: No primary key could be found for table SALGRADE. Please specify one with
    --split-by or perform a sequential import with '-m 1'.
    原因是没有找到主键,详见《数据库导入到HDFS原理》,解决办法如下:
    1)添加主键;
    2)使用--split-by ' GRADE';
    3)使用-m 1,m为几那么在HDFS上就会生成几个文件,就不存在按照字段拆分多个任务的问题;

    sqoop import --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL 
    --username SCOTT --password tiger 
    --table SALGRADE  
    --target-dir SALGRADE 
    --fields-terminated-by '	' --lines-terminated-by '
    ' 
    --split-by 'GRADE' --null-string '' --null-non-string '0'  -m 2;

    查看执行结果:
    hadoop fs -ls /user/hadoop/SALGRADE

    /user/hadoop/SALGRADE/_SUCCESS        
    /user/hadoop/SALGRADE/_logs           
    /user/hadoop/SALGRADE/part-m-00000    
    /user/hadoop/SALGRADE/part-m-00001    
    
    hadoop fs -cat /user/hadoop/SALGRADE/part-m-00000
    1       700     1200
    2       1201    1400

     

    文件脚本导入命令

    命令太长,不便查看,将命令写到文件中去:emp.opt
    /home/hadoop/luogankun/workspace/shell/sqoop下创建emp.opt

    import  
    --connect
    jdbc:oracle:thin:@192.168.1.100:1521:ORCL
    --username
    SCOTT
    --password
    tiger
    --table
    EMP
    --target-dir
    EMP_OPTIONS_FILE
    -m
    2

    执行脚本:

    cd  /home/hadoop/luogankun/workspace/shell/sqoop
    sqoop --options-file ./emp.opt
  • 相关阅读:
    JUnit-执行测试
    JUnit注释的执行顺序
    回文数字
    JUnit简单测试
    利用jspx解决jsp后缀被限制拿shell
    wifi破解到局域网渗透
    爬虫之一:爬补天厂商数据(爬虫)
    三位一体的漏洞分析方法-web应用安全测试方法
    json.dumps错误:'utf8' codec can't decode byte解决方案
    nmap小技巧[1] 探测大网络空间中的存活主机
  • 原文地址:https://www.cnblogs.com/luogankun/p/3894954.html
Copyright © 2011-2022 走看看