SQOOP从MySQL导入数据到HDFS

一、Sqoop导入的参数是import

可以通过sqoop import –help查看import的具体用法

[root@hadoop001 conf]# sqoop import --help

参数太多就不列举了,大家可以自己去测试看看。

二、导入数据
1、执行以下命令
sqoop import –connect jdbc:mysql://hadoop001:3306/sqoop –username root –password 123456 –table udp_dept \
–mapreduce-job-name sqoop_test \
–columns “dept_code,dept_name” \
–target-dir /data/dept \
–where “dept_code>’3200’” \
-m 1 \
–as-sequencefile \
–compression-codec gzip

2、HDFS上查看

[root@hadoop001 software]# hdfs dfs -text /data/dept/part-m-00000
3201,中医科病区
3202,中医科门诊
3203,中医科专家门诊
5201,外科普通门诊
5202,外科专家门诊
3903,康复医学科病区
6001,疼痛科病区
6301,普通外科二科门诊
3902,康复医学理疗普通门诊
3901,康复医学理疗专家门诊
6302,普通外科二科病区
6102,普通外科一科病区
6101,普通外科一科门诊
6202,胸外科病区
6201,胸外科门诊

3、从import过程的输出信息可以看出sqoop的import操作只有mapper没有reduce的

17/10/10 17:33:43 INFO mapreduce.Job:  map 0% reduce 0%
17/10/10 17:34:01 INFO mapreduce.Job:  map 100% reduce 0%
17/10/10 17:34:01 INFO mapreduce.Job: Job job_1507615410140_0001 completed successfully

4、参数详解
–connect 连接数据库的URL
–username DB的连接用户名
–password DB用户的密码
–table 表名
–mapreduce-job-name 任务名称(默认是table_name.jar)
–columns 指定表中的特定字段抽取到HDFS
–target-dir 抽取数据到HDFS的那个路径
(注意:/data/dept中的dept必须不存在,否则报错)
–where 条件(只抽取满足条件的数据到HDFS)
-m map数(默认是4)
–as-sequencefile 指定导入到HDFS的文件格式
–compression-codec 指定文件压缩格式(gzip/snappy等)

5、SQL语句模式导入

sqoop import --connect jdbc:mysql://hadoop001:3306/sqoop --username root --password 123456 \
--mapreduce-job-name sqoop_test \
--target-dir /data/dept2 \
-m 1  \
--as-sequencefile \
--delete-target-dir \
--compression-codec snappy \
--query 'select dept_code,dept_name,sort from udp_dept where dept_code>3200 and $CONDITIONS'

–query 后面可以根据sql语句来进行导入数据,但是 –query和 –table、–columns 不能一起使用,而且必须包含$CONDITIONS。

6、导入没有主键的表
emp表没有主键

mysql> select * from emp;
+--------+---------------+--------------+
| EMP_NO | EMP_NAME      | Job          |
+--------+---------------+--------------+
|   1250 | yangyamei     | 护士         |
|   1251 | zhangzhenxing | 卫生技术     |
|   1261 | zhangjun      | 其他         |
+--------+---------------+--------------+

执行导入语句

sqoop import --connect jdbc:mysql://hadoop001:3306/sqoop --username root --password 123456 --table emp \
--mapreduce-job-name sqoop_test \
--as-sequencefile \
--target-dir /data/nopr \
--compression-codec gzip

会抛以下错误

Error during import: No primary key could be found for table emp. Please specify one with --split-by or perform a sequential import with '-m 1'

因为mapper数默认是4,需要分4个Task。但是emp表又没有主键,不知道以哪个字段为准来分Task。
所以当导入没有主键的表时一定要指定–split-by 或者-m 参数

sqoop import --connect jdbc:mysql://hadoop001:3306/sqoop --username root --password 123456 --table emp \
--mapreduce-job-name sqoop_test \
--as-sequencefile \
--target-dir /data/nopr \
--compression-codec gzip \

--split-by EMP_NO

7、指定字段与字段之间的分隔符

sqoop import --connect jdbc:mysql://hadoop001:3306/sqoop --username root --password 123456 --table emp \
--mapreduce-job-name sqoop_test \
--as-sequencefile \
--target-dir /data/nopr \
--compression-codec gzip \

--fields-terminated-by '\t' 

8、转换Null参数

sqoop import --connect jdbc:mysql://hadoop001:3306/sqoop --username root --password 123456 --table emp \
--mapreduce-job-name sqoop_test \
--as-sequencefile \
--target-dir /data/nopr \
--compression-codec gzip \

--null-non-string '0' \
--null-string '' \

9、Direct Mode
官网解释

在某些特定关系型数据库导入数据时指定–direct参数可以提高导入效率。

sqoop import --connect jdbc:mysql://hadoop001:3306/sqoop --username root --password 123456 --table emp \
--mapreduce-job-name sqoop_test \
--as-sequencefile \
--target-dir /data/nopr \
--compression-codec gzip \

--direct
Databaseversion–direct support?connect string
HSQLDB1.8.0+Nojdbc:hsqldb:*//
MySQL5.0+Yesjdbc:mysql://
Oracle10.2.0+Yesjdbc:oracle:*//
PostgreSQL8.3+Yes (import only)jdbc:postgresql://
CUBRID9.2+NOjdbc:cubrid:*

10、增量数据导入参数

sqoop import --connect jdbc:mysql://hadoop001:3306/sqoop --username root --password 123456 --table emp \
--mapreduce-job-name sqoop_test \
--target-dir /data/emp_append2 \
-m 1 \
--check-column EMP_NO \
--incremental  append \
--last-value   1250

–check-column 以哪个字段来作为增量的判断
–incremental 增量导入类型(append/lastmodified)
–last-value 设定作为增量字段具体的值,只抽取大于这个值的数据

查看hdfs会发现emp表只有两条数据导入过来了

[root@hadoop001 native]# hadoop fs -text /data/emp_append2/part-m-00000
1251,zhangzhenxing,卫生技术
1261,zhangjun,其他
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值