Mapper.class は、ユーザー定義のレデューサーと共に、フェーズで実際のマッパーとして使用できることに気付きました。例えば、
Phase 1:
Mapper.class -> WordCountReduce.class
これは機能します。ただし、Reducer.class を同じように使用することはできません。つまり、次のようなもの
Phase 2:
WordReadMap.class -> Reducer.class
動作しないでしょう。
何故ですか?
出力が入力と同じクラスである限り、なぜそうならないのかわかりません。新しい APIのデフォルトは、渡されたものをそのまま書き出すだけで、次のように実装されています。
@SuppressWarnings("unchecked")
protected void reduce(KEYIN key, Iterable<VALUEIN> values, Context context
) throws IOException, InterruptedException {
for(VALUEIN value: values) {
context.write((KEYOUT) key, (VALUEOUT) value);
}
}
古い API の場合、これはinterface
であり、インターフェースを直接インスタンス化することはできません。それを使用している場合、それが失敗の理由です。繰り返しMapper
ますが、これもインターフェイスであり、インスタンス化できないはずです...