使用merge-key进行sqoop incremental lastmodified

时间:2016-08-24 00:32:03

标签: sqoop

我正在尝试导入HDFS中的更新记录。之前我在HDFS中有三个部分文件。当我在工具下面运行时,它给出了一个错误,需要合并密钥。

sqoop import --table employee --username training --password training --connect jdbc:mysql://localhost/loudacre --incremental lastmodified --check-column modified --last-value '2016-08-22 19:02:41'

但是,当我使用 merge-key 选项时,我只能看到包含所有记录的部分文件。

2 个答案:

答案 0 :(得分:1)

尽管帖子很旧,但我为那些有相同问题的人加分。

@Deepak_Spark_Beginner:如果错误提示“需要合并密钥”,则意味着“ --target-dir”已经存在。由于您未在Sqoop命令中指定此选项,因此选择了默认值,即表名'employee'。意味着,已经存在一个名为employee的目录。

接下来,当您在执行以下操作顺序的增量方法期间指定合并键时,

  1. 所有符合最后一个值标准的行都将导入到一个临时位置。此执行仅运行地图作业。可以在日志中看到以下内容

8/10/30 13:27:52信息mapreduce。工作:地图0%减少0%

18/10/30 13:27:58信息mapreduce。工作:地图67%减少0%

18/10/30 13:27:59信息mapreduce.Job:地图100%减少0%

  1. 接下来,合并操作在原始目标目录“ employee”和临时目标目录之间发生,其中--merge-key中指定的列用于更新现有数据。这将运行映射器和化简器,可以在日志中看到以下内容

18/10/30 13:28:08 INFO mapreduce.Job:地图0%减少0%

18/10/30 13:28:14信息mapreduce。工作:地图17%减少0%

18/10/30 13:28:16信息mapreduce。工作:地图100%减少0%

18/10/30 13:28:20 INFO mapreduce.Job:地图100%减少100%

由于键匹配必须扫描完整的数据集的明显原因,因此需要

reduce作业。另外,您可以通过文件名进行验证,该文件名的“ r”表示减速器输出。

这就是为什么在输出中仅看到1个文件的原因。

您评论了“我的意思是仅从数据库中获取修改的字段并使用lastmodified更新HDFS”。好吧,这就是发生的事情。如果检查输出,则执行已从数据库获取了修改的字段并在HDFS中进行了更新。唯一的区别是输出被合并到一个文件中。

答案 1 :(得分:0)

我猜这是预期的。通常,在使用--incremental lastmodified模式进行增量导入后运行合并工具

合并数据集时,假设每条记录中都有唯一的主键值(提及为--merge-key )。

合并工具将运行mapreduce作业,将所有数据集合并为一个,为每个--merge-key获取最新的可用行。

检查sqoop docs以获取更多详细信息。