-1

マッパーで文字列を値として渡そうとしていますが、書き込み可能ではないというエラーが発生します。解決方法は?

public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {

    String TempString = value.toString();
    String[] SingleRecord = TempString.split("\t");

    //using Integer.parseInt to calculate profit
    int Amount = Integer.parseInt(SingleRecord[7]);
    int Asset = Integer.parseInt(SingleRecord[8]);
    int SalesPrice = Integer.parseInt(SingleRecord[9]);
    int Profit = Amount*(SalesPrice-Asset);

    String ValueProfit = String.valueOf(Profit);
    String ValueOne = String.valueOf(one);

    custID.set(SingleRecord[2]);
    data.set(ValueOne + ValueProfit);
    context.write(custID, data);

}
4

2 に答える 2

0

上記のインポートテキストに従ってマップ関数にデータを設定していません.TextWritableは間違っています.Textも使用してください.

于 2015-12-18T10:09:33.973 に答える
0

Yahoo のチュートリアルには、次のように書か
れています。ファイルとの間でネットワークを介してマーシャリングできるオブジェクトは、Writable と呼ばれる特定のインターフェイスに従う必要があります。

Cloudera
のサイトから : キー クラスと値クラスは、フレームワークによってシリアル化できる必要があるため、Writable インターフェイスを実装する必要があります。さらに、主要なクラスは、並べ替えを容易にするために WritableComparable インターフェイスを実装する必要があります。

Writableしたがって、コンテキスト内の値として書き込むには の実装が必要です。Hadoop には、 などのいくつかのストック クラスが付属していIntWritableます。Stringあなたが探している相手はクラスTextです。次のように使用できます。

context.write(custID, new Text(data));

また

Text outValue = new Text();
val.set(data);
context.write(custID, outValue)   

私の場合、値クラスに特殊な機能が必要な場合は、実装することができますWritable(大したことではありません)。しかし、あなたには十分なようTextです。

于 2014-11-12T06:15:40.660 に答える