怎么导入oracle emp,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 ‘\t‘ --lines-terminated-by ‘\n‘ \--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-00001hadoop 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 ‘\t‘:字段之间采用tab分隔

4)--lines-terminated-by ‘\n‘:行之间采用回车分隔

根据条件导入数据

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 ‘\t‘ --lines-terminated-by ‘\n‘ \--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 ‘\t‘ --lines-terminated-by ‘\n‘ \--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 ‘\t‘ --lines-terminated-by ‘\n‘ \--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-00001hadoop 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-m2

执行脚本:

cd /home/hadoop/luogankun/workspace/shell/sqoop

sqoop--options-file ./emp.opt

原文:http://www.cnblogs.com/luogankun/p/3894954.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值