0

我正在使用 Mapper 加载具有执行时间和与之关联的大型查询的大量数据。我只需要找到 1000 个最昂贵的查询,所以我将执行时间作为我的输出的关键映射器。我使用 1 个减速器,只希望写入 1000 条记录并且减速器停止处理。

我可以有一个全局计数器并执行此操作 if(count < 1000) { context.write(key,value) }

但这仍然会加载所有数十亿条记录,然后不写入它们。

我希望减速器在吐出 1000 条记录后停止。那里通过避免寻找下一组记录的时间和读取时间。

这可能吗??

4

1 回答 1

7

您可以通过覆盖该Reducer.run()方法的默认实现来完全简化您的减速器:

public void run(Context context) throws IOException, InterruptedException {
  setup(context);
  while (context.nextKey()) {
    reduce(context.getCurrentKey(), context.getValues(), context);
  }
  cleanup(context);
}

您应该能够修改 while 循环以包括您的计数器,如下所示:

public void run(Context context) throws IOException, InterruptedException {
  setup(context);
  int count = 0;
  while (context.nextKey() && count++ < 1000) {
    reduce(context.getCurrentKey(), context.getValues(), context);
  }
  cleanup(context);
}

并不是说这不一定会输出最多的记录,而只会输出前 1000 个键控记录(如果您的 reduce 实现输出多于一条记录,则将不起作用 - 在这种情况下,您可以在 reduce 方法中增加计数器)

于 2013-06-25T00:03:13.353 回答