开发者学堂课程【Sqoop 企业级大数据迁移方案实战:导出 Export--更新模式导出(Insert)--Updateonly】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/718/detail/12843
导出 Export--更新模式导出(Insert)--Updateonly
更新模式导出 Updateonly
本节学习更新导出模式 Updateonly,只进行数据的更新,当数据发生变化的时候,只会将已有的数据、已经存在的数据、发生变化的数据进行更改。对于新增加的数据并不会进行修改。
1.参数说明
--update-key,更新标识,即根据某个字段进行更新,例如 id,可以指定多个更新标识的字段,多个字段之间用逗号分隔。
--updatemod,指定updateonly(默认模式),仅仅更新已存在的数据记录,不会插入新纪录。
2. 准备 HDFS 数据
在 HDFS“/updateonly_1/"目录的下创建一个文件 updateonly_1.txt:
1201,gopal,manager,50000
//编号、名字、职位、薪水
1202,manisha,preader,50000
1203,kalil,php dev,30000
演示:
打开服务器输入 hadoop fs -mkdir /updateonly_1/
创建好文件夹后创建文件 updateonly_1.txt
输入 vim updateonly_1.txt
进入后复制粘贴代码:
1201,gopal,manager,50000
1202,manisha,preader,50000
1203,kalil,php dev,30000
保存后退出,继续输入:hadoop fs -put updateonly_1.txt /updateonly_1/
完成后刷新页面,结果显示
3.手动创建 mysql 中的目标表
将刚才的文件手动导出到 mysql 中的目标表中
打开 Navicat,粘贴如下代码:
mysql> USE userdb;
mysqI>CREATE TABLE updateonly(
id INT NOT NULL PRIMARY KEY
name VARCHAR(20)
deg VARCHAR(20),
salary INT);
然后选择点击运行已选择的,运行完后刷新表,可以看到列表中多出 updateonly,目前该表中没有数据。
4.先执行全部导出操作:
在 sqoop 中输入:
bin/sqoop export \
--connect jdbc:mysql://node-1:3306/userdb\
--username root\
--password hadoop \
--table updateonly\
--export-dir /updateonly_1/
结果报错,可以忽略:为终端异常,是虚拟机内存不足
结束后成功导出3条记录。此时打开 MySQL 再来刷新:
表中导入3条数据
5.新增一个文件 updateonly_2.txt :
修改了前三条数据并且新增了一条记录
同样先创建文件夹,打开服务器,输入
hadoop fs -mkdir /updateonly_2
接着创建文件 updateonly_2.txt,输入
vim updateonly_2.txt
进入后粘贴以下记录:修改了薪水数据并且新增一条记录1204
1201,gopal,manager,1212
1202,manisha,preader,1313
1203,kalil,php dev,1414
1204,allen,java,1515
保存后退出,输入 hadoop fs -put updateonly_2.txt /updateonly_2/
此时刷新访问网页结果显示多出
6.执行更新导出:
如果符合标准只会更新已经存在的记录,不会新增加。
bin/sgoop export \
--connect jdbc:mysql://node-1:3306/userdb \
--username root \
--password hadoop\
--table updateonly\
-export-dir /updateonly_2 / \
--update-key id\
--update-mode updateonly
复制语句打开 sqoop 进行执行
如果过程出现问题可以查看相关日志或者容器日志来确定哪一阶段出现问题。
结果显示:出现4条记录
但是刷新表,依然是3条数据
将前三条记录中的 salary 进行修改即已有的数据有变化的发生修改,1204之前不存在不能 insert 进入。所以确实为只更新。
小结:
更新导出
oupdateonly 只更新已经存在的数据,不会执行 insert 增加新的数据