开发者学堂课程【Sqoop 企业级大数据迁移方案实战:导出 Export--更新模式导出(Insert)--Allowinsert】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/718/detail/12844
导出 Export--更新模式导出(Insert)--Allowinsert
更新模式导出(Insert)--Allowinsert
本节学习更新导出中的 Allowinsert 模式。在这种模式下的导出变得更加丰富。如果已有的数据发生变化更改,它会更改已有的数据,另外一点如果有新的进度产生,也会插入新的数据,在该模式下底层是 insert&update 两种操作,更新已经存在的数据、插入没有的数据。
1.参数说明
--update-key,更新标识,即根据某个字段进行更新,例如 id,可以指定多个更新标识的字段,多个字段之间用逗号分隔。
--updatemod,指定 allowinsert,更新已存在的数据记录,同时插入新记录。实质上是一个 insert&update 的操作。
2.准备 HDFS 数据
在 HDFS“/allowinsert_1/"目录下创建一个文件 allowinsert_1.txt:
打开服务器,输入:hadoop fs -mkdir /allowinsert_1/
接着编辑文件 allowinsert_1.txt,输入
vim allowinsert_1.txt
进入后复制粘贴
1201,gopal,manager,50000
1202,manisha,preader,50000
1203,kalil,php dev30000
进行保存。
3.手动创建 mysql 中的目标表
打开 Navicat,复制粘贴如下代码:
mysql>USE userdb;
mysql>CREATE TABLE allowinsert(
id INT NOT NULL PRIMARY KEY
name VARCHAR(20),
deg VARCHAR(20),
salary INT);
选中语句后点击运行已选择的。然后刷新表,可以看到表列表中多出 allowinsert,现在该表中没有数据。
4.先执行全部导出操作
该操作与更新导出没有关系,只是将 allowinsert_1.txt中的记录插入表中
打开 sqoop,复制粘贴如下代码:
bin/sqoop export\
--connect jdbc:mysql://node-1:3306/userdb\
--username root\
-password hadoop \
--table allowinsert\
--export-dir /allowinsert_1/
5.更新导出操作
打开服务器,在全部导出操作完成后输入 hadoop fs -mkdir /allowinsert_2/
创建 allowinsert_2.txt。修改了前三条数据并且新增了一条记录。上传至/allowinsert_2/目录下
输入:vim allowinsert_2.txt
进入后复制粘贴如下代码:
1201,gopal,manager,1212 //修改了薪水,新增一条记录
1202,manisha,preader,1313
1203,kalil,php dev,1414
1204,allen,java,1515
保存后退出,输入 hadoop fs -put allowinsert_2.txt /allowinsert_2/
完成后刷新页面可以看到多出 allowinsert_2数据:
6.执行更新导出
打开服务器,输入如下代码:
bin/sqoop export\
--connect jdbc:mysql://node-1:3306/userdb\
--username root
--password hadoop\
--table allowinsert\
--export-dir /allowinsert_2/\
--update-key id\
--update-mode allowinsert
验证是否三条数据中的薪水进行 update,如果出现1204说明 insert 进行了更新,满足两个条件则为 Allowinsert 模式。
结果显示导入4条记录。在数据库中进行刷新查看:
发现表中前三条记录的 salary 发生修改,最后一条记录1204被插入。
在实际生活中可以根据应用需求选择相关的模式,例如一个表中的数据一直发生变化,只新增选用 Allowinsert 更加友好。因为它的底层既有插入操作又有更新操作。
小结:
更新导出
updateonly 只更新已经存在的数据,不会执行 insert 增加新的数据
allowinsert 更新已有的数据,插入新的数据,底层相当于 insert&update