String 如何在映射器中将字符串作为值传递?

String 如何在映射器中将字符串作为值传递?,string,hadoop,mapper,writable,String,Hadoop,Mapper,Writable,我试图在映射器中传递字符串作为值,但得到的错误是它不可写。如何解决 public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String TempString = value.toString(); String[] SingleRecord = TempString.split("\t"); //using In

我试图在映射器中传递字符串作为值,但得到的错误是它不可写。如何解决

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

}

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

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

因此,您需要一个
Writable
的实现来将其作为一个值写入上下文中。Hadoop附带了一些股票类,如
intwriteable
。您要查找的
字符串
对应项是
文本
类。它可以用作:

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

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

在这种情况下,您需要value类中的专门功能,您可以实现
可写的
(毕竟没什么大不了的)。然而,似乎
文本
对您来说就足够了

您没有根据上面的导入文本在映射函数中设置数据,TextWritable是错误的,只需使用文本即可。

什么是
数据
什么是
custId
?我们尝试了您的建议,但仍然得到一个错误:此行有多个标记-构造函数文本(IntWritable)未定义-方法write类型TaskInputOutputContext中的(Text,TextWritable)不适用于参数(Text,Text)可能
数据
可写的
。请共享
映射器的完整代码
以获得快速解决方案。
公共无效映射(长可写键,文本值,上下文)抛出IOException,InterruptedException{String TempString=value.toString();String[]SingleRecord=TempString.split(“\t”);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(利润);String ValueOne=String.valueOf(一);custID.set(单记录[2]);context.write(custID,新文本(数据));}
我的意思确实是
映射器
-整个类,而不仅仅是
映射
方法,您已经分享过了。
数据的主要问题
-它肯定不是一个字符串。或者您已经搞乱了导入。您好,欢迎来到StackOverflow!提供一个代码片段或示例将非常有用(请参阅)。