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

yeotifhr  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(651)

我试图传递一个字符串作为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);

}
p3rjfoxz

p3rjfoxz1#

雅虎的教程说:
可以封送到文件或从文件封送到网络上的对象必须遵循一个称为writable的特定接口,该接口允许hadoop以序列化形式读写数据以进行传输。
从cloudera站点:
键和值类必须可由框架序列化,因此必须实现可写接口。此外,键类必须实现writablecomparable接口以便于排序。
所以你需要一个 Writable 将其作为上下文中的值写入。hadoop附带了一些股票类,比如 IntWritable . 这个 String 你要找的对手是 Text 班级。可用作:

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

或者

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

在这种情况下,您需要在value类中实现专门的功能,您可以实现 Writable (毕竟不是什么大事)。但是看起来 Text 对你来说就足够了。

nnsrf1az

nnsrf1az2#

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

相关问题