我试图传递一个字符串作为Map器中的值,但得到的错误是它不可写。如何解决?
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条答案
按热度按时间p3rjfoxz1#
雅虎的教程说:
可以封送到文件或从文件封送到网络上的对象必须遵循一个称为writable的特定接口,该接口允许hadoop以序列化形式读写数据以进行传输。
从cloudera站点:
键和值类必须可由框架序列化,因此必须实现可写接口。此外,键类必须实现writablecomparable接口以便于排序。
所以你需要一个
Writable
将其作为上下文中的值写入。hadoop附带了一些股票类,比如IntWritable
. 这个String
你要找的对手是Text
班级。可用作:或者
在这种情况下,您需要在value类中实现专门的功能,您可以实现
Writable
(毕竟不是什么大事)。但是看起来Text
对你来说就足够了。nnsrf1az2#
您还没有根据上面的导入文本在map函数中设置数据,textwritable是错误的,只需使用文本即可。