0.20.2 ...ReduceContextのcontext.write()メソッドをオーバーライドできますか?
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);
}
前ロジック/書き込みが異なることが多い、と異なる場合に発生書き込みがあるかもしれません後。私は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());
}
:
マイエンドの目標は、このようなものです。
trans1とtrans2はどこから来ますか?それはあなたが鍵から抜け出すものなのでしょうか?基本的にReducerからコードを取り出し、ReduceContext.write()に入れ、Identity Reducerを使用するように思えます。 – Drizzt321
trans1とtrans2変数は、私が書いたすべての還元剤が実装するReducerを拡張するカスタムクラスの一部です。コマンドラインパラメータによっては、キー、キーと値、または値だけが、trans2(キーの場合)またはtrans1(値の場合)に格納されているTransformerに基づいて別の形式に変換されることがあります。 – BugsPray
あなたのレデューサーでやっていることは何ですか?それ以外の場合は、ReducerContext.write()にあなたのレデューサーに属するコードを移動しようとしているように基本的に聞こえるからです。単純に、Key&Value&Contextを渡す単一の関数を作成し、その関数にif/elseを実行させるのはなぜでしょうか。 ReducerContextをオーバーライドしようとするよりずっと簡単です。 – Drizzt321