mysql - Sqoop 增量导入和更新不起作用

标签 mysql hadoop hdfs sqoop

如何像更新MySQL表中的数据一样更新HDFS文件中的数据? 我查了一下互联网,但所有给出的例子都是--incremental lastmodified例子。

在我的例子中,我的 MySQL 表不包含日期或时间戳列。 如何更新 HDFS 文件中的数据,类似于 MySQL 表中不包含日期列的数据?

我有如下的 MySQL 表

mysql> select * from employee;
+----+--------+--------+------+-------+-----------+
| id | name   | gender | age  | state | language  |
+----+--------+--------+------+-------+-----------+
|  1 | user1  | m      |   25 | tn    | tamil     |
|  2 | user2  | m      |   41 | ka    | tamil     |
|  3 | user3  | f      |   47 | kl    | tamil     |
|  4 | user4  | f      |   52 | ap    | telugu    |
|  5 | user5  | m      |   55 | ap    | telugu    |
|  6 | user6  | f      |   43 | tn    | tamil     |
|  7 | user7  | m      |   34 | tn    | malayalam |
|  8 | user8  | f      |   33 | ap    | telugu    |
|  9 | user9  | m      |   36 | ap    | telugu    |

我使用以下命令导入到 HDFS。

[cloudera@localhost ~]$ sqoop import --connect jdbc:mysql://localhost:3306/mydatabase --username root --table employee --as-textfile --target-dir hdfs://localhost.localdomain:8020/user/cloudera/data/employee 

数据按预期导入。

[cloudera@localhost ~]$ hadoop fs -ls /user/cloudera/data/employee/
Found 6 items
-rw-r--r--   3 cloudera cloudera          0 2017-08-16 23:57 /user/cloudera/data/employee/_SUCCESS
drwxr-xr-x   - cloudera cloudera          0 2017-08-16 23:56 /user/cloudera/data/employee/_logs
-rw-r--r--   3 cloudera cloudera        112 2017-08-16 23:56 /user/cloudera/data/employee/part-m-00000
-rw-r--r--   3 cloudera cloudera        118 2017-08-16 23:56 /user/cloudera/data/employee/part-m-00001
-rw-r--r--   3 cloudera cloudera        132 2017-08-16 23:56 /user/cloudera/data/employee/part-m-00002
-rw-r--r--   3 cloudera cloudera        136 2017-08-16 23:56 /user/cloudera/data/employee/part-m-00003

现在我更新了值并在 mysql 表中插入了值。但是这个表不包含日期列。

mysql> update employee set language = 'marathi' where id >= 8;
mysql> insert into employee (name,gender,age,state,language from people) values('user11','f','25','kl','malayalam');

我知道可以使用 --check-column、incremental append 和 --last-value 将新插入的值插入到 hdfs。

但是我如何更新 hdfs 中已更新为“marathi”的 mysql 表第 8 行和第 9 行的值?此外,我的员工表不包含日期或时间戳列。

最佳答案

对于新插入的行,你总是可以使用:

--增量追加--check-column id --last-value 9

但是要从没有 updated_at 列的表中获取更新,我认为那是不可能的。如果您的表非常小,那么可能每次都进行完整转储。

或者,如果您以某种方式可以跟踪自上次导入以来所有 ID 更新的内容,那么假设您知道自上次导入以来更新了 ID 7、3、4 和 8,您可以使用最小更新 ID 并用作 --last-value。所以你的配置将是:

--增量追加--check-column id --last-value 3 --merge-key id

其中 --merge-key id 将告诉 sqoop merge 新的增量数据与基于 id 列的旧数据。

关于mysql - Sqoop 增量导入和更新不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45729454/

相关文章:

apache-kafka - 对新列使用不同的 avro 架构

python - 使用python在HDFS中创建文件

php - PHP列与第1行的值不匹配

unix - 使用外部 HDD 上的虚拟机作为 Hadoop 集群的节点

file - 在 Pig 中使用 LOAD 时排除某些文件被加载

hadoop - HIVE Alter命令更改行格式

尝试将 Spark RDD 存储到 HBase 时出现 java.io.FileNotFoundException

php - 通过PHP解析不完整字符串的json

mysql - 在Mysql中用条件识别具体的id

mysql - Mysql+Nodejs如何回调结果