如何在mapper中将字符串作为值传递?

时间:2014-11-11 16:36:17

标签: string hadoop mapper writable

我试图在mapper中传递一个字符串作为值,但是得到的错误是它不可写。怎么解决?

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

}

2 个答案:

答案 0 :(得分:0)

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

来自Cloudera网站:
键和值类必须由框架序列化,因此必须实现Writable接口。此外,关键类必须实现WritableComparable接口以便于排序。

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

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

OR

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

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

答案 1 :(得分:0)

你没有根据上面的导入文本在地图功能中设置数据,而TextWritable错误只是使用Text。