一、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,其他