sqoop的简单用法
- 596 次检阅

emmmmm,为了阐述写这次文章的理由是什么的话?那可能就是最近我那么分析大佬们,天天要我导数据,oracle<---->hive/hdfs,贼浪费我时间!然后哪位拆一代的卢胖子,想教会他自己导,居然不学、不看、不动...这里强烈的谴责!

好了不BB...下面应该是我自己笔记,内容有错的话,自己去看书-->Hadoop大数据挖掘从入门到跑路..


这个用的应该是sqoop..它是hadoop生态圈的一员吧,剩下的自己百度,因为我也是辣鸡的小白,之前教我的大佬走了.不然你们可以坑他一逼(此处要有滑稽脸?)

sqoop操作--从Oracle导入到HDFS

先上导出脚本

sqoop import -Dmapred.job.queue.name=jfa5d_queue --connect jdbc:oracle:thin:@10.201.xx.xx:1522/mmds --username 你数据库账号 --password 数据库密码 --table TEMP_HJX_XL_TT --columns "COMPANY,MSISDN,IMEI,TAC" --target-dir /user/jfa5d/glj_test/TEMP_HJX_XL_TT/ --fields-terminated-by ',' --lines-terminated-by '\n' --null-string '' --null-non-string '0' -m 2;

说明:

-Dmapred.job.queue.name=jfa5d_queue:为指定的资源池/指定队列

--connect jdbc:oracle:thin:@//10.201.29.41:1522/mmds :指定JDBC连接字符串

--username、--password:就是数据库的账号密码啦..

--table :数据库表名

--columns :需要导出的字段,逗号分隔(没有这个参数就是全表字段导出)

--target-dir :导入HDFS的目标路径,如果目录已经存在,则报错;需要先删除你要上传的目录:hadoop fs -rmr /user/hadoop/xxxxx,建议自己先建以自己名字首字母的目录,不然删错了别人了,你跪键盘吧

--fields-terminated-by:字段之间采用什么分隔符,我这里是用逗号

--lines-terminated-by :行之间采用啥分隔符号,我这里用回车..

--null-string:当string类型的字段为空时,使用''代替

--null-non-string :当非string类型的字段为空时,使用0代替

-m n或者--num-mappers n :n为数字,代码启动建立n个并发执行任务

sqoop操作--从HDFS导到ORACLE

也是先上脚本,然后自己分析吧

sqoop export -Dmapred.job.queue.name=jfa5d_queue --connect jdbc:oracle:thin:@//10.201.xxx.xxx:1522/mmds --username xxx --password xxx --table temp_hjx_xl_tt --columns "COMPANY,MSISDN,IMEI,TAC" --export-dir /user/jfa5d/glj_test/pushFile/ --input-fields-terminated-by '\001' --input-lines-terminated-by '\n' --input-null-string '\\N' --input-null-non-string '\\N'  --num-mappers 8

脚本基本上一样,就是参数分别为:export、import,相同的参数我就不再解释

--export-dir:导出数据的HDFS目录。

--input-fields-terminated-by:文件的分隔符,如果是hive自动生成默认为\001

--input-lines-terminated-by:行之间的分隔符

--input-null-string:当非string类型的字段为空时,如果是hive自动生成默认为\N

--input-null-non-string:当非string类型的字段为空时,如果是hive自动生成默认为\N

-m n或者--num-mappers n :n为数字,代码启动建立n个并发执行任务

注意问题

1.分割符的方向问题:

首先sqoop的参数要小心, 如果是从数据库导出数据,写到HDFS的时候,字段分割符号和行分割符号必须要用

--fields-terminated-by 和 --lines-terminated-by

而不是有input的:

--input-fields-terminated-by和 --input-fields-terminated-by的

--input前缀的使用于读文件的分割符号,便于解析文件,所以用于从HDFS文件导出到数据库,两个用法方向不一样。

emmm.快两点了,好了不写了,我的午休时间没有了...如有错误,都是我水平不够,但我不听。


--delete-target-dir  删除目标文件夹(建议少用自己手动删一下)

--where 按条件导入数据  -->--where 'id<3'

--query  按照sql语句进行导入ps:使用--query关键字,就不能使用--table和--columns,自定义sql语句的where条件中必须包含字符串 $CONDITIONS,$CONDITIONS是一个变量,用于给多个map任务划分任务范围 -->--query "select * from user where id>1 and \$CONDITIONS"
(或者quer使用这种格式:--query 'select * from user where id>1 and $CONDITIONS')


分享到:
,

这篇文章有1条评论

  1. NO:2951 / 發布於 - 2019-5-24 #1 回复

    非技术的路过。

发表评论