使用更新密钥导出Sqoop

时间:2014-09-17 09:39:10

标签: hadoop hdfs sqoop2

我必须将HDFS文件导出到MySql中 假设我的HDFS文件是:

1,abcd,23
2,efgh,24
3,ijkl,25
4,mnop,26
5,qrst,27

并说我的Mysql数据库架构是:

+-----+-----+-------------+
| ID  | AGE |    NAME     |
+-----+-----+-------------+
|     |     |             |
+-----+-----+-------------+

当我使用以下Sqoop命令插入时:

sqoop export \
--connect jdbc:mysql://localhost/DBNAME \
--username root \
--password root \
--export-dir /input/abc \
--table test \
--fields-terminated-by "," \
--columns "id,name,age"

它正常工作并插入数据库。

但是,当我需要更新现有记录时,我必须使用--update-key--columns

现在,当我尝试使用以下命令更新表时:

sqoop export \
--connect jdbc:mysql://localhost/DBNAME \
--username root \
--password root \
--export-dir /input/abc \
--table test \
--fields-terminated-by "," \
--columns "id,name,age" \
--update-key id

我遇到的问题是,数据未按照--columns

中的说明更新到列中

我做错了什么?

我们不能这样更新数据库吗? HDFS文件应该只在Mysql架构中更新?

还有其他方法可以达到这个目的吗?

4 个答案:

答案 0 :(得分:7)

4b。将HDFS中的数据更新到关系数据库中的表

在mysql test db

中创建emp表tbl
create table emp
(
id int not null primary key,
name varchar(50)
);

vi emp - >创建包含以下内容的文件

1,Thiru
2,Vikram
3,Brij
4,Sugesh

将文件移至hdfs

hadoop fs -put emp <dir>

执行以下sqoop作业将数据导出到mysql

sqoop export --connect <jdbc connection> \
--username sqoop \
--password sqoop \
--table emp \
--export-dir <dir> \
--input-fields-terminated-by ',';

验证mysql表中的数据

mysql> select * from emp;

+----+--------+
| id | name   |
+----+--------+
|  1 | Thiru  |
|  2 | Vikram |
|  3 | Brij   |
|  4 | Sugesh |
+----+--------+

更新\ temp文件&amp;将更新的文件移动到hdfs。 更新文件的内容

1,Thiru
2,Vikram
3,Sugesh
4,Brij
5,Sagar

用于upsert的Sqoop导出 - 如果密钥与其他插入匹配则更新。

sqoop export --connect <jdbc connection> \
--username sqoop \
--password sqoop \
--table emp \
--update-mode allowinsert \
--update-key id \
--export-dir <dir> \
--input-fields-terminated-by ',';

Note: --update-mode <mode> - we can pass two arguments "updateonly" - to update the records. this will update the records if the update key matches.
if you want to do upsert (If exists UPDATE else INSERT) then use "allowinsert" mode.
example: 
--update-mode updateonly \ --> for updates
--update-mode allowinsert \ --> for upsert

验证结果:

mysql> select * from emp;
+----+--------+
| id | name   |
+----+--------+
|  1 | Thiru  |
|  2 | Vikram |
|  3 | Sugesh |--> Previous value "Brij"
|  4 | Brij   |--> Previous value "Sugesh"
|  5 | Sagar  |--> new value inserted
+----+--------+

答案 1 :(得分:2)

试试 $(this).each(function(){ if(this.checked){ alert($(this).index()); } });

 sqoop export --connect jdbc:mysql://localhost/DBNAME -username root -password root --export-dir /input/abc --table test --fields-terminated-by "," --update-key id 

它对我有用。它会更新与主键匹配的所有记录。 (它可能不会插入新数据)

明智地使用--update-key primary_key

答案 2 :(得分:1)

您可能想尝试使用--input-fields-terminated-by。 目前,您使用的是字段终止的,用于导入。

答案 3 :(得分:0)

我实际上是在Sqoop上以多种方式使用它。 Update-Key只能更新表中已存在的列,并且不能插入它们,除非您还提到允许插入的更新模式(所有数据库都不支持)。如果您实际尝试使用update-key进行更新,它将更新update-key中提到的密钥的行。