使用合并键修改sqoop增量

ykejflvf  于 2021-06-03  发布在  Sqoop
关注(0)|答案(2)|浏览(365)

我正在尝试导入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选项时,我只能看到包含所有记录的部分文件。

xmq68pz9

xmq68pz91#

我想这是意料之中的。通常,合并工具是在增量导入之后运行的 --incremental lastmodified 模式。
在合并数据集时,假设每个记录中都有一个唯一的主键值(以下简称为 --merge-key ).
合并工具将运行mapreduce作业,将所有数据集合并为一个数据集,并为每个数据集获取最新的可用行 --merge-key .
查看sqoop文档了解更多详细信息。

vm0i2vca

vm0i2vca2#

虽然这是一篇很老的帖子,但我还是为那些有同样问题的人加分。
@deepak\u spark\u初学者:如果错误提示“需要合并密钥”,则表示“-target dir”已经存在。由于您没有在sqoop命令中指定此项,因此会选择默认值,即表名“employee”。也就是说,名为employee的目录已经存在。
下一步,当您在以下操作序列的增量方法中指定合并键时,
满足最后一个值条件的所有行都将导入到临时位置。此执行只运行map-only作业。这可以在以下日志中看到
8/10/30 13:27:52 info mapreduce.job:Map0%减少0%
18/10/30 13:27:58 info mapreduce.job:Map67%减少0%
18/10/30 13:27:59 info mapreduce.job:Map100%减少0%
接下来,合并操作在原始目标目录'employee'和临时目标目录之间进行,其中--merge key中指定的列用于更新现有数据。它运行mappers和reducer,可以在日志中看到,如下所示
18/10/30 13:28:08 info mapreduce.job:Map0%减少0%
18/10/30 13:28:14 info mapreduce.job:Map17%减少0%
18/10/30 13:28:16 info mapreduce.job:Map100%减少0%
18/10/30 13:28:20 info mapreduce.job:Map100%减少100%
reducer作业是必需的,因为很明显,键匹配必须扫描完整的数据集。另外,你可以通过你的文件名来验证,这个文件名会有一个表示reducer输出的r。
这就是为什么在输出中只能看到一个文件的原因。
您评论说“我的意思是从数据库中获取modified字段并使用lastmodified更新hdfs”。嗯,事情就是这样。如果检查输出,则执行已从数据库中获得修改的字段,并在hdfs中更新。唯一的区别是输出合并到一个文件中。

相关问题