2011-08-12 2 views
2

0.20.2 ...ReduceContextのcontext.write()メソッドをオーバーライドできますか?

ReduceContextcontext.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); 
} 

前ロジック/書き込みが異なることが多い、と異なる場合に発生書き込みがあるかもしれません後。私はif (trans1 !=...の代わりにcontext.write(a,b)を呼び出すことができるので、if-> transform機能を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); 
} 

または類似した何か:write()メソッドをオーバーライドして

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()); 
} 

マイエンドの目標は、このようなものです。

+1

trans1とtrans2はどこから来ますか?それはあなたが鍵から抜け出すものなのでしょうか?基本的にReducerからコードを取り出し、ReduceContext.write()に入れ、Identity Reducerを使用するように思えます。 – Drizzt321

+1

trans1とtrans2変数は、私が書いたすべての還元剤が実装するReducerを拡張するカスタムクラスの一部です。コマンドラインパラメータによっては、キー、キーと値、または値だけが、trans2(キーの場合)またはtrans1(値の場合)に格納されているTransformerに基づいて別の形式に変換されることがあります。 – BugsPray

+2

あなたのレデューサーでやっていることは何ですか?それ以外の場合は、ReducerContext.write()にあなたのレデューサーに属するコードを移動しようとしているように基本的に聞こえるからです。単純に、Key&Value&Contextを渡す単一の関数を作成し、その関数にif/elseを実行させるのはなぜでしょうか。 ReducerContextをオーバーライドしようとするよりずっと簡単です。 – Drizzt321

答えて

1

私は使用しているOutputFormatクラスをオーバーライドします。 OutputFormatは、実際にデータを書き込むRecordWriterに答える責任があります。 write(key、value)の実装がsuper.write(key、value)を呼び出す前に共通のアクションを実行する、現在のRecordWriterのサブクラスを書くことができるようです。 OutputFormatサブクラスがRecordWriterサブクラスに応答するようにします。

関連する問題