sqoop export导出数据到mysql(追加/更新)

准备数据:
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时替换成对应的值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值