-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

雅虎的教程说:
可以通过网络编组到文件或从文件编组的对象必须服从一个特定的接口,称为 Writable,它允许 Hadoop 以序列化的形式读取和写入数据以进行传输。

来自 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 回答
0

您还没有根据上面的导入文本在地图功能中设置数据,并且TextWritable是错误的,只需使用Text即可。

于 2015-12-18T10:09:33.973 回答