0

私はJavaMRプログラムを持っています。Mapメソッドの出力はさまざまな文字列/数値であり、現時点では文字列に入れています。Reduceでは、文字列を分割してパラメータを操作します。さて、これはもっと簡単にできるのではないかと思います。

文字列/数値を、各値を説明する名前付きキーを持つ値として格納するマップを考えていました。このマップは、私の「バリューアウト」(MapOutputValueClass)になります。

これは可能ですか?ドキュメントでこれを読んでいると、私のアイデアは実装できないと思います。

The key and value classes have to be serializable by the framework and hence need to implement the Writable interface. Additionally, the key classes have to implement the WritableComparable interface to facilitate sorting by the framework.

では、MapOutputValueClassに何を選択するようにアドバイスしますか?:-)たぶん、マップを取得して、ImmutableBytesWritableに変換しますか?また、プログラムの速度を落としたくありません...

答えてくれてありがとう!

4

1 に答える 1

1

さまざまな文字列/数値を使用して独自のクラスを作成できます。たとえば、マッパーの出力値クラスとレデューサーの入力値クラスとして渡します。

Class Foo{
     String A;
     String B;
     int c, d;

      ....
}

あなたのマッパーで:

public class MyMapper extends Mapper<Text, Text, Text, Foo>{
      ....
}

レデューサーで:

public class MyReducer extends Reducer<Text, Foo, Text, LongWritable>{
       ...
}

あなたのドライバーで:

マッパー出力値クラスを設定します。

job.setMapOutputValueClass(Foo.class);

extends Mapperあなたが記入する必要があるクラスは、次の順序であることを<KEYIN_CLASS, VALUEIN_CLASS, KEYOUT_CLASS, VALUEOUT_CLASS>覚えておいてください:Reducer

于 2012-06-19T19:22:21.407 に答える