我正在尝试将字符串作为值传递给映射器,但是却收到错误消息,指出它不可写。怎么解决?

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);

}

最佳答案

雅虎的教程说:
可以与文件归档或从网络归档的对象必须遵循一个称为Writable的特定接口(interface),该接口(interface)允许Hadoop以串行化的形式读写数据以进行传输。

从Cloudera网站:
键和值类必须由框架可序列化,因此必须实现Writable接口(interface)。此外,键类必须实现WritableComparable接口(interface)以方便排序。

因此,您需要实现Writable才能将其写为上下文中的值。 Hadoop附带了一些库存类,例如IntWritable。您要查找的String对应项是Text类。它可以用作:

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

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

我的情况是,您需要在值类中使用专门的功能,可以实现Writable(毕竟没什么大不了的)。但是,似乎Text对您而言就足够了。

关于string - 如何在映射器中将字符串作为值传递?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26869808/

10-13 04:47