可以覆盖ReduceContext中的context.write()方法吗?

时间:2011-08-12 20:12:18

标签: java hadoop mapreduce

使用0.20.2 ...

是否可以覆盖context.write()中的ReduceContext方法?我有一整套Reducers,我希望在每个context.write()之前都使用特定的函数,但我不希望他们担心这个逻辑,只是为了让它透明地处理。

例如:

Iterator<Text> vit = values.iterator();

if (trans2 != null) {
    key = (Text) trans2.transform(key);
}

while (vit.hasNext()) {
    Text item = vit.next();
    if (trans1 != null) {
        item = (Text) trans1.transform(item);
    }
    context.write(key, item);
}

写入之前/之后的逻辑通常是不同的,并且可能存在在不同情况下发生的写入。我想将if-&gt;转换功能移到write()函数中,这样我就可以调用context.write(a,b)而不是if (trans1 !=...

我的最终目标是这样的:

protected void reduce(Text key, Iterable<Text> values, Context context) 
        throws IOException, InterruptedException {
    Iterator<Text> vit = values.iterator();

    while (vit.hasNext())
        context.write(key, vit.next());
}

使用write()方法覆盖:

public void write(Text key, Text val) {
    if (trans1 != null)
        val = trans1.transform(val);
    if (trans2 != null)
        key = trans2.transform(key);
    super.write(key,val);
}

或类似的东西。

1 个答案:

答案 0 :(得分:1)

我会看一下覆盖你正在使用的OutputFormat类。 OutputFormat有责任回答执行实际数据写入的RecordWriter。看起来你应该能够编写当前RecordWriter的子类,其write(key,value)的实现在调用super.write(key,value)之前执行公共操作。使您的OutputFormat子类回答RecordWriter子类。