java - Spring Batch 中的 MapReduce/聚合操作

标签 java mapreduce batch-processing spring-batch

是否可以在 SpringBatch 中进行 MapReduce 风格的操作?

我的批处理作业有两个步骤。第一步计算平均值。第二步将每个值与平均值进行比较以确定另一个值。

例如,假设我有一个庞大的学生分数数据库。第一步计算每门类(class)/考试的平均分数。第二步根据一些简单的规则将个人分数与平均分数进行比较以确定等级:

  1. 如果学生成绩高于平均水平
  2. B,如果学生成绩平均
  3. C 如果学生成绩低于平均水平

目前我的第一步是选择平均值并将其写入表的 Sql。第二步是一个 Sql,它将平均分数与个人分数结合起来,并使用处理器来实现规则。

有类似的聚合函数,如 avg,min 在 Steps 中使用了很多,如果这可以在 Processors 中完成,保持 Sqls 尽可能简单,我真的很喜欢。有什么方法可以编写一个处理器,它根据分组标准跨多行聚合结果,然后将平均值/最小值写入输出表一次?

这种模式重复了很多,我不是在寻找使用 Sql 的单处理器实现,它可以获取平均分数和个人分数。

最佳答案

这是可能的。您甚至不需要超过一步。 Map-Reduce 可以一步实现。您可以使用与之关联的 ItemReader 和 ItemWriter 创建一个步骤。将 ItemReader -ItemWriter 对视为 Map-Reduce。您可以通过使用具有适当行聚合的自定义读取器和写入器来实现必要的效果。对于您的读写器来说,实现 Stream 接口(interface)以保证 Spring 批处理的中间 StepContext 保存操作可能是个好主意。

我试过只是为了好玩,但我认为这毫无意义,因为你的工作能力受到单个 JVM 的限制,换句话说:你无法达到 Hadoop 集群(或其他真正的 map reduce 实现)生产环境性能。此外,随着数据量的增长,将很难实现可缩放。

很好的观察,但 IMO 目前对现实世界的任务毫无用处。

关于java - Spring Batch 中的 MapReduce/聚合操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6120654/

相关文章:

java - 程序退出时清除 JTextArea.copy() 剪贴板

java - 根据单词的长度在reducer上分类

grails - 如何在 Grails 中实现批处理

java - 如何使用递归检查数组中的所有值是否相等?

java - 在 JVM 之间共享数据

java - 迭代的MapReduce作业具有NumberFormatException错误

java - 带有 Liberty Profile 的 JSR 352 - 当 ItemReader 执行数据库查询时如何实现检查点

linux - 当目录中的文件发生修改时调用 shell 脚本

java - 中断等待用户输入的线程,然后退出应用程序

hadoop - MapReduce不会减少?