MapReduce:将Reducer的结果分组成固定大小的块



我正在使用Map Reduce框架。

假设这是输入列表[A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P ,Q, R, S, T, U, V, W, X, Y, Z]我的Mapper产生以下输出:

<"Key 1" : A>
<"Key 2" : B>
<"Key 3" : C>
<"Key 1" : D>
<"Key 2" : E>
<"Key 3" : F>
<"Key 1" : G>
<"Key 2" : H>
<"Key 3" : I>
<"Key 1" : J>
<"Key 2" : K>
<"Key 3" : L>
<"Key 1" : M>
<"Key 2" : N>
<"Key 3" : O>
<"Key 1" : P>
<"Key 2" : Q>
<"Key 3" : R>
<"Key 1" : S>
<"Key 2" : T>
<"Key 3" : U>
<"Key 1" : V>
<"Key 2" : W>
<"Key 3" : X>
<"Key 1" : Y>
<"Key 2" : Z>

现在Reducer的输出通常是这样的:

<"Key 1" : A, D, G, J, M, P, S, V, Y>
<"Key 2" : B, E, H, K, N, Q, T, W, Z>
<"Key 3" : C, F, I, L, O, R, U, X>

但是我想做的是这样的:

我想将每个密钥的输出分成3个块,然后生成最终的Reducer输出。

所以我想让我的Reducer输出看起来像这样:

<"Key 1" : [A, D, G], [J, M, P], [S, V, Y]>
<"Key 2" : [B, E, H], [K, N, Q], [T, W, Z]>
<"Key 3" : [C, F, I], [L, O, R], [U, X]>

任何帮助将非常感激,因为我被困在这个问题已经两天了。我不知道最后一部分,即如何将输出分组为3个块。

注:如果块大小小于3(如最后一个键的示例),则可以,但不应超过3。

我想,这很简单:

  1. 在你的reducer中,一次取3个值到for循环中。
  2. 用您选择的分隔符将这三个连接起来,并写入context

    上下文。写(关键字,值)

请注意,您可以多次写入上下文,即:对于3个输出的每个块,只需写入上下文,然后执行next3个值的集合

如果你有什么困难,请告诉我。

一个更复杂的解决方案可能是使用MultiOutputs。您甚至可以使用它写入不同的文件。

一个很好的例子是在这里使用hadoop 1.0.2

下面是取自javadocs的示例:

Usage in Reducer:
 <K, V> String generateFileName(K k, V v) {
   return k.toString() + "_" + v.toString();
 }
 public class MOReduce extends
   Reducer<WritableComparable, Writable,WritableComparable, Writable> {
 private MultipleOutputs mos;
 public void setup(Context context) {
 ...
 mos = new MultipleOutputs(context);
 }
 public void reduce(WritableComparable key, Iterator<Writable> values,
 Context context)
 throws IOException {
 ...
 mos.write("text", , key, new Text("Hello"));
 mos.write("seq", LongWritable(1), new Text("Bye"), "seq_a");
 mos.write("seq", LongWritable(2), key, new Text("Chau"), "seq_b");
 mos.write(key, new Text("value"), generateFileName(key, new Text("value")));
 ...
 }
 public void cleanup(Context) throws IOException {
 mos.close();
 ...
 }
 }

是的,在你的例子中,你可以使用ArrayWritable作为你的reducer值类,将值写为固定大小的块。

你可以做的是,

  • 维护一个实例数组列表变量,固定大小为3减速机类。

  • 在reduce()中,遍历给定键的值列表,并添加到数组列表

  • 如果数组列表的大小达到3,则只需将其转换为
    ArrayWritable实例,并将其传递给write(),然后重置

  • 在作业中声明outformat值类为ArrayWritable
    配置。

相关内容

  • 没有找到相关文章

最新更新