详解:Sqoop的导入和导出数据

一:导入数据

导入:RDBMS ==> Hadoop

[hadoop@hadoop001 bin]$ pwd
/home/hadoop/app/sqoop-1.4.6-cdh5.7.0/bin
[hadoop@hadoop001 bin]$ sqoop help

import             Import a table from a database to HDFS

[hadoop@hadoop001 bin]$ sqoop help import

操作:

sqoop import \
--connect jdbc:mysql://localhost:3306/sqoop \
--username root \
--password root \
--table emp \
--delete-target-dir   这个是为了删除名字的jar包

在这个执行过程中,出现错误,是因为没有java-json.jar  架包
下载网址:http://www.java2s.com/Code/Jar/j/Downloadjavajsonjar.htm
将它导入lib下面即可 

导入语句:

sqoop import \
--connect jdbc:mysql://localhost:3306/sqoop \
--username root \
--password root \
--table emp \
--mapreduce-job-name FromMySQLToHDFS \
-m 1 \    默认是4,这里更改为1 
--delete-target-dir \
--columns 'EMPNO,ENAME,JOB,SAL,COMM' \    导入列 
--target-dir EMP_COLUMN_WHERE \  导到哪里去 目录
--fields-terminated-by '\t' \     更改分隔符 
--null-non-string '0' \     非字符窜类型更改为0
--null-string '' \             
--where 'SAL>2000'        筛选 

默认输出的路劲就是HDFS:/user/${user}/emp 下。

问题来了

如果我想运行一个sql语句可以么

sqoop import \
--connect jdbc:mysql://localhost:3306/sqoop \
--username root \
--password root \
--mapreduce-job-name FromMySQLToHDFS \
-m 1 \
--delete-target-dir \
--target-dir EMP_COLUMN_QUERY \
--fields-terminated-by '\t' \
--null-non-string '0' \
--null-string '' \
-e "select * from emp where empno>7900 and \$CONDITIONS"  这里是一个sql语句 
后面不要写空格,否则运行不下去的

这里:使用–query做查询,–query和–table不能同时使用
"select * from emp where empno>7900 and \$CONDITIONS"这种写法注意 

'select * from emp where empno>7900 and $CONDITIONS'  和这种写法  


如果这张表示没有组建的 ,可以通过split by 进行制定 

--split-by GRADE \

脚本执行:

使用一堆的参数在shell中书写十分不方便。sqoop可以运行脚本吗,可以。

将运行参数写到一个脚本文件中,如 emp.opt
vim emp.opt
将参数写入到这个文件,如
import
--connect
jdbc:mysql://hadoop001:3306/mysqoopdata
--username
root
--password
root
--table
emp
注意,一个命令一行,前后不能有空格。
按照如下方式执行就可以了,和原来的一样。
sqoop --options-file emp.opt

二:导出数据

导入是指Hadoop上的数据导出到MySQL上,导出的时候要注意,MySQL中表如果不存在则不会成功,所以先要创建好表然后再导出。

sqoop export \
--connect jdbc:mysql://localhost:3306/sqoop \
--username root \
--password root \
--table emp_d5 \  这张表要提前创建好  
--export-dir /user/hadoop/emp \
--columns 'EMPNO,ENAME,JOB,SAL,COMM' \  指定的字段 
--fields-terminated-by '\t'  自己指定分隔符  

导入hive中

在这之前要把hive的相关的jar复制到这边

[hadoop@hadoop001 lib]$ cp hive-common-1.1.0-cdh5.7.0.jar /home/hadoop/app/sqoop-1.4.6-cdh5.7.0/lib/
[hadoop@hadoop001 lib]$ cp hive-shims-* /home/hadoop/app/sqoop-1.4.6-cdh5.7.0/lib/
在这导入之前要把相应的jar放到lib下面  

导入语句

sqoop import \
--connect jdbc:mysql://localhost:3306/sqoop \
--username root \
--password root \
--table emp \
--delete-target-dir \
--hive-import  \
--hive-table d5_emp_test_p \一般情况下是要先创建表的
--fields-terminated-by '\t' \
--columns 'EMPNO,ENAME,JOB,SAL,COMM' \
--hive-overwrite \
--hive-partition-key 'pt' \
--hive-partition-value 'ruoze'

sqoop导入有一个问题啊,不能自动分区,必须指明分区值….

三:Hive导出到Mysql

Hive导出到MySQL。其实就是HDFS到mysql

sqoop export \
--connect jdbc:mysql://hadoop001:3306/mysqoopdata \
--username root 
--password root \
-m  1\
--mapreduce-job-name FromHDFSToMySQL \
--table emp_demo \
--export-dir /user/hive/warehouse/database_test.db/emp_partition/pt=2018-08-08 \
--input-fields-terminated-by '\t' \
--input-null-string '\\N' 

四:Sqoop jop

每次执行一堆参数真的会比较麻烦,可以使用shell脚本,可以使用job来简化。sqoop help job查看使用方法

sqoop job --create ruoze_job -- \
import \
--connect jdbc:mysql://localhost:3306/sqoop \
--username root \
--password root \
--table emp \
--delete-target-dir \
--target-dir EMP_JOB

这样的job就存储在sqoop中,可以使用定时运行脚本工具 crontab ,运行脚本内容sqoop job – exec myjob,这样可以定时运行任务。
  有一点需要注意下,运行Job的时候是需要手工输入密码,对于–password root这个参数好像没什么用。

验证作业
$ sqoop job --list

显示
$ sqoop job --show myjob

执行 
$ sqoop job --exec myjob
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值