Можно переопределить метод context.write () в ReduceContext? - PullRequest
2 голосов
/ 13 августа 2011

Используя 0.20.2 ...

Возможно ли переопределить метод context.write() в ReduceContext? У меня есть целый набор редукторов, которые я хотел бы, чтобы все использовали определенную функцию перед каждым 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-> transform в функцию 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 Ответ

1 голос
/ 03 апреля 2014

Я бы посмотрел на переопределение класса OutputFormat, который вы используете.OutputFormat несет ответственность за возможность ответить на RecordWriter, который выполняет фактическую запись данных.Кажется, вы должны быть в состоянии написать подкласс текущего RecordWriter, чья реализация write (ключ, значение) выполняет общие действия перед вызовом super.write (ключ, значение).Сделайте так, чтобы ваш подкласс OutputFormat отвечал подклассу RecordWriter.

...