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-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 '\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-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

 

分类: sqoop
标签: sqoop

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423709.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

three20 TTTableViewController + TTActionSheetController

1. 首页要实现TTActionSheetControllerDelegate interface TSPublishViewController : TTTableViewController<TTActionSheetControllerDelegate> {CATETYPE _cateType; } property(nonatomic,assign)CATETYPE cateType;end 2. 在init中声明URLMAP规则 - (id)initWithNib…

如果没有,那么就去创造

上周末在回北京的路上&#xff0c;看到一个广告牌&#xff0c;上面有一句&#xff1a;“如果没有&#xff0c;那么就去创造”。 是啊&#xff0c;自己的生活只能靠自己创造&#xff0c;从无到有。转载于:https://www.cnblogs.com/skogkatt/archive/2008/09/10/4163277.html

Java枚举类型 enum

定义 An enum type is a special data type that enables for a variable to be a set of predefined constants. The variable must be equal to one of the values that have been predefined for it.枚举类型是一种特殊数据类型&#xff0c;能够为一个变量定义一组预定义的常…

ps学习1:去除图片上的文字

首先我们看到如图所示的图&#xff0c;这个时候我们要给他右上角的文字去除 首先打开我们的ps工具--我登陆的在线ps教程 https://www.uupoop.com/ 点击编辑---填充 保存 完成修改

Git学习(3)GitHub和SVN的区别

GitHub和SVN的区别 之前用的版本控制系统是SVN&#xff0c;但是最近因为流行使用GitHub&#xff0c;这篇文章认识一下Git和SVN的区别。 1&#xff09;Git是分布式的&#xff0c;SVN不是&#xff1a; 这 是git和其它非分布式的版本控制系统&#xff0c;例如SVN&#xff0c;CVS等…

位运算 中度难度 子集

怎样将一个字符串中的单词单独存放在一个单词数组里&#xff1f; #include <iostream> #include <cstdio> #include <vector> #include <sstream> #include <string> using namespace std; int main() {string str[100];string str1 "i lo…

python3获取两个日期之间所有日期,以及比较大小

原创 2017年10月09日 14:00:14标签&#xff1a;python 1370 [python] view plaincopy import datetime [python] view plaincopy #获取两个日期间的所有日期 def getEveryDay(begin_date,end_date): date_list [] begin_date datetime.datetime.strptime(be…

关于换行符

在正则表达式中&#xff0c;有一个\n是newline的意思&#xff0c;又有一个\r是carriage return(就是这个导致了白痴中文翻译"回车")的意思 在处理String或者console输出的时候&#xff0c;无论带上哪个都能换行。 但是偏偏在txt中&#xff0c;哪个都不是标准的换行&a…

Java面试题15牛客 以下关于Integer与int的区别错误的是

Java面试题15牛客 以下关于Integer与int的区别错误的是 A int是java提供的8种原始数据类型之一 B Integer是java为int提供的封装类 C int的默认值为0 D Integer的默认值为1 懵逼树上懵逼果&#xff0c;懵逼树下你和我&#xff0c;这题难度一般&#xff0c;很显然&#xff…

用示例说明BitMap索引的效率要优于B-Tree索引

一、实验说明&#xff1a; 操作系统&#xff1a;rhel 5.4 x86 数据库&#xff1a;Oracle 11g R2 二、操作步骤&#xff1a; 首先创建一张t_btree表&#xff0c;并建立B-Tree索引&#xff0c;索引键是status&#xff1a; 1 SQL> create table t_btree as select * from dba_o…

使用grep -v时候,想去除多个pattern

使用grep -v时候&#xff0c;想去除多个pattern 原创 2014年05月27日 14:01:033845 grep -v with multiple patternsgrep test somefile | grep -v -e error -e critical -e warninggrep test somefile | grep -vE (error|critical|warning)grep test somefile | grep -vE err…

ISA Server 2004 0x80004005错误

客户的一台ISA Server EE中文版&#xff0c;运行服务器管理出现如下问题&#xff1a; “ISA服务器无法加载属性页”详细信息“错误&#xff1a;0x80004005未指定的错误”点“继续”后提示“管理单元初始化失败”&#xff0c;“确定”后再次弹出“ISA服务器无法加载属性页”的提…

Java面试题16 牛客 以下java程序代码,执行后的结果是()

Java面试题16 牛客 以下java程序代码&#xff0c;执行后的结果是&#xff08;&#xff09; 1 2 3 4 5 6 7 8 9 10 public class Test { public static void main(String[] args) { Object o new Object() { public boolean equals(Object o…

Singularity 介绍

"...it is impossible to predict how a singularity will affect objects in its causal future." - NCSA Cyberia Glossary 一些有用的连接&#xff1a; Microsoft Research Singularity Project Singularity RDK Singularity: Rethinking Dependable System De…

Hive压缩说明

为什么要压缩 在Hive中对中间数据或最终数据做压缩&#xff0c;是提高数据吞吐量和性能的一种手段。对数据做压缩&#xff0c;可以大量减少磁盘的存储空间&#xff0c;比如基于文本的数据文件&#xff0c;可以将文件压缩40%或更多。同时压缩后的文件在磁盘间传输和I/O也会大大减…

Java面试题17 牛客 下面哪个选项正确创建socket连接?

Java面试题17 牛客 下面哪个选项正确创建socket连接&#xff1f; Socket s new Socket(8080); Socket s new Socket(“192.168.1.1”,8080) SocketServer s new Socket(8080); Socket s new SocketServer(“192.168.1.1”,8080) 懵逼树上懵逼果&#xff0c;懵逼树下你…

视频素材网站

http://soft.dvedit.cn/soft/05/down-2172.html 转载于:https://www.cnblogs.com/liuguanghuiyes/archive/2008/10/04/1303830.html

kubelet源码学习(一):kubelet工作原理、kubelet启动过程

本文基于Kubernetes v1.22.4版本进行源码学习 1、kubelet工作原理 1&#xff09;、kubelet核心工作 kubelet的工作核心就是一个控制循环&#xff0c;即&#xff1a;SyncLoop&#xff08;图中的大圆圈&#xff09;。而驱动这个控制循环运行的事件&#xff0c;包括&#xff1a;P…

算法导论课后习题解析 第四章 下

4.5-1a) $$a2,b4,f(n)\Theta(1),\log_b a \frac 12 \gt 0 $$ 符合情况1&#xff0c;$ T(n) \Theta (n^{1/2})$ b) $$a2,b4,f(n)\Theta(n^{1/2}),\log_b a \frac 12 $$ 符合情况2&#xff0c;$ T(n) \Theta (n^{1/2}\lg n)$ c) $$a2, b4, f(n)\Theta(n),\log_b a \frac 1…

Java面试题18 牛客 假定Base b = new Derived();

Java面试题18 牛客 假定Base b new Derived&#xff08;&#xff09;; 调用执行b.methodOne&#xff08;&#xff09;后&#xff0c;输出结果是什么&#xff1f; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 public class Base { public…