【问题标题】:How to pass string as value in mapper?如何在映射器中将字符串作为值传递?
【发布时间】:2014-11-11 16:36:16
【问题描述】:

我试图在映射器中将字符串作为值传递,但收到错误,表明它不可写。如何解决?

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

}

【问题讨论】:

  • 什么是data,什么是custId

标签: string hadoop mapper writable


【解决方案1】:

Yahoo 的教程说:
可以通过网络与文件进行编组或从文件编组的对象必须遵循称为 Writable 的特定接口,该接口允许 Hadoop 以序列化的方式读取和写入数据传输格式。

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

所以你需要一个Writable 的实现来将它写为上下文中的一个值。 Hadoop 附带了一些股票类,例如IntWritable。您正在寻找的 String 对应物是 Text 类。它可以用作:

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

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

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

【讨论】:

  • 我们尝试了您的建议,但仍然收到错误:此行有多个标记 - 构造函数 Text(IntWritable) 未定义 - TaskInputOutputContext 不适用于参数(Text, Text)
  • 也许dataIntWritable。请分享您的Mapper 的完整代码以获得快速解决方案。
  • public void map(LongWritable key, Text value, Context context) throws 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(Profit); String ValueOne = String.valueOf(one); custID.set(SingleRecord[2]); context.write(custID, new Text(data)); }
  • 我确实是指Mapper - 整个班级,而不仅仅是您已经分享的map 方法。 data 的主要问题 - 它绝对不是字符串。或者你搞砸了导入。
【解决方案2】:

你没有按照上面的导入文本在map函数中设置数据,TextWritable是错误的,用Text也是。

【讨论】:

  • 您好,欢迎来到 StackOverflow!提供代码 sn-p 或示例将很有帮助(请参阅how to answer)。
猜你喜欢
  • 2022-07-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多