准备数据:
data.txt
1,zhangsan,18,2020-01-01
2,lisi,19,2020-02-02
3,wangwu,20,2020-03-03
4,zhaoliu,21,2020-04-04
5,tianqi,22,2020-05-05
6,luba,23,2020-06-06
7,sunjiu,24,2020-07-07
8,gaoshi,25,2020-08-08
9,xiaoshiyi,26,2020-09-09
10,wushier,27,2020-10-10
将数据放到hdfs:
hdfs dfs -mkdir /sqoopdata
hdfs dfs -put data.txt /sqoopdata/
创建mysql表
CREATE TABLE `sqooptest` (
`id` int(11) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`create_date` date DEFAULT NULL
)
1 全字段增量导入
bin/sqoop export \
--connect jdbc:mysql://node03:3306/test \
--username root \
--password 123456 \
--table sqooptest \
--m 1 \
--export-dir /sqoopdata/data.txt \
--input-fields-terminated-by ","
导出成功后:
此种方式为增量导入,再执行一次sqoop job数据依然进入sqooptest表
2 前缀字段增量导入
清空一下sqooptest表
bin/sqoop export \
--connect jdbc:mysql://node03:3306/test \
--username root \
--password 123456 \
--table sqooptest \
--m 1 \
--columns id,name,age \
--export-dir /sqoopdata/data.txt \
--input-fields-terminated-by ","
上方我指定的columns是mysql中的字段,hdfs文件中是有四列,我只指定了mysql三个字段,这时导出时候根据","切割的data.txt只会取前三列,分别对应sqooptest表中的id,name,age三个字段
执行后
3 增量更新导入
sqooptest为了1和2的演示没有设置主键,下面重新创建sqooptest表,指定id为主键
CREATE TABLE `sqooptest` (
`id` int(11) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`create_date` date DEFAULT NULL,
PRIMARY KEY (`id`)
)
参数说明
--update-key
指定要要根据哪个值进行更新
--update-mode
指定更新模式:updateonly(默认)或者allowinsert
执行第一次
bin/sqoop export \
--connect jdbc:mysql://node03:3306/test \
--username root \
--password 123456 \
--table sqooptest \
--m 1 \
--columns id,name,age,create_date \
--export-dir /sqoopdata/data.txt \
--input-fields-terminated-by "," \
--update-key id \
--update-mode allowinsert
执行第二次,发现表没有变化.
此时我们删除id为10的数据,更改id为9的数据
执行第三次发现数据又变成第一次执行后的样子.
说明:--update-mode allowinsert
是根据id主键有就更新,没有就插入,相当于on duplicate key update 语句 ,--update-key
指定的是主键,如果更改job中的--update-key age
执行结果与--update-key id
的效果是一样的.如果表中没有主键也没有唯一索引,数据会增量导入到表中,没有任何更新操作.如果要详细了解这个模式,需要完全理解on duplicate key update语句的执行.
4 更新导入
清空sqooptest表,先用–update-mode allowinsert将数据导入,之后执行
bin/sqoop export \
--connect jdbc:mysql://node03:3306/test \
--username root \
--password 123456 \
--table sqooptest \
--m 1 \
--columns id,name,age,create_date \
--export-dir /sqoopdata/data.txt \
--input-fields-terminated-by "," \
--update-key id \
--update-mode updateonly
无论执行多少次数据都是没有变化,此时更改sqooptest表数据
再次执行
--update-mode updateonly
模式下是调用update xxxx where id =xxx(–update-key id)语句,此时与主键和唯一索引没有关系,update-key在这种模式下,才有作用.
5 总结
如果想要增量导入不更新,调用1或者2,如果要执行有就插入没有就更新使用
--update-mode allowinsert
如果只是更新数据,mysql没有对应的值就不更新使用
另外还可以指定
–-input-null-string ‘xx’
字符串类型为null时替换成对应的值
–-input-null-non-string ‘xx’
非字符串类型为null时替换成对应的值