Java 是否可以重写ReduceContext中的context.write()方法?

Java 是否可以重写ReduceContext中的context.write()方法?,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,使用0.20.2 是否可以重写ReduceContext中的context.write()方法?我有一整套简化程序,我想在每个context.write()之前都使用一个特定的函数,但我不想让他们担心这个逻辑,只想透明地处理它 例如: Iterator<Text> vit = values.iterator(); if (trans2 != null) { key = (Text) trans2.transform(key); } while (vit.hasNext()

使用0.20.2

是否可以重写
ReduceContext
中的
context.write()
方法?我有一整套简化程序,我想在每个
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);
}
使用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);
}

或者类似的东西。

我将考虑重写您正在使用的OutputFormat类。OutputFormat负责回答实际写入数据的RecordWriter。似乎您应该能够编写当前RecordWriter的子类,其write(key,value)实现在调用super.write(key,value)之前执行常见操作。让OutputFormat子类回答RecordWriter子类。

trans1和trans2来自哪里?是你从钥匙里弄出来的吗?基本上,听起来你想从你的减缩器中提取代码,把它放到ReduceContext.write()中,然后使用Identity减缩器。trans1和trans2变量是一个自定义类的一部分,它扩展了我编写的所有减缩器都实现的减缩器。根据命令行参数的不同,有时键、键和值,或者仅值会根据存储在trans2(用于键)或trans1(用于值)中的转换器转换为不同的格式。在减速机中是否还有其他操作?因为在其他情况下,它基本上听起来像是您试图将属于reducer的代码移动到ReducerContext.write()中。为什么不简单地创建一个传递键、值和上下文的函数,并让该函数执行if/else操作呢。比试图覆盖ReducerContext要容易得多。这就是我目前所做的。问题是,我有很多简化程序,我会写更多。使用哪个减速机是由命令行中的一个参数决定的,因此我试图使它更易于扩展。现在看来还可以,谢谢。:)因此,创建一个扩展Reducer的基类,每个子类都需要使用该基类的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);
}