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