这是我的情景。我有一份处理大量csv数据的工作,并使用Avro将其写入按日期划分的文件中。我得到了一个小文件,我希望用它来更新其中一些文件,其中包含第二个作业,我可以在需要时运行,而不是再次重新处理整个数据集。
以下是这个想法的样子:
所以,我必须这样写Java作业。我的第一份工作似乎工作正常。我也不确定如何接近工作2.
这就是我的想法:
这是一个如何实现这个?如果不是更好的方法是什么?合成器在这里有意义吗?我觉得答案是肯定的。
提前致谢。
答案 0 :(得分:3)
您可以按照以下方法:
1)在所有csv文件上运行job1
2)在小文件上运行job2并创建新输出
3)对于更新,您需要再运行一个作业,在此作业中,在setup()方法中加载job2的输出,并将job1的输出作为map()输入。然后编写更新逻辑并生成最终输出。
4)然后运行你的job3进行处理。
据我所知,这将有效。
答案 1 :(得分:2)
只是一个疯狂的想法:为什么你需要实际更新job1
输出?
如果基于日期的分组是目标,那么在这里你有很多优点,显而易见的是:
InputFormat
。看起来不那么复杂。InputFormat
应该小心。限制:
InputFormat
。至于我的好选择,如果我能正确理解你的情况,你可以/需要按日期将文件分组作为JOB3的输入。
希望这会对你有所帮助。
答案 2 :(得分:1)
对于Job2,您可以读取更新文件以过滤驱动程序代码中的输入数据分区,并将其设置在输入路径中。您可以按照当前方法读取更新文件作为分发缓存文件。如果您想要在无法读取更新文件时使作业失败,请在安装方法本身中抛出异常。
如果更新逻辑不需要在reduce端进行聚合,则将Job2设置为仅映射作业。您可能需要构建逻辑以在Job3中识别更新的输入分区,因为它将接收Job1输出和Job2输出。