一、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

Database

version

–direct support?

connect string

HSQLDB

1.8.0+

No

jdbc:hsqldb:*//

MySQL

5.0+

Yes

jdbc:mysql://

Oracle

10.2.0+

Yes

jdbc:oracle:*//

PostgreSQL

8.3+

Yes (import only)

jdbc:postgresql://

CUBRID

9.2+

NO

jdbc: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,其他