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

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

}

最佳答案

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

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

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

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

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

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

关于string - 如何在映射器中将字符串作为值传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26869808/

相关文章:

java - 使用 Jackson 解析 Json 文件时无法反序列化 parseJason 实例

c++ - 使用 + 运算符的字符串连接

javascript - 使用javascript获取两个字符串之间的字符串

hadoop - hbase.cluster.distributed设置为true但它表示false

Hadoop关闭,如何在伪分布式模式下停止hadoop?

hadoop - 洗牌阶段实际上做了什么?

java - 如何从 objectMapper 获取 "unset"injectableValues?

javascript - 使用其中的字符串作为函数名称(Javascript)

python - 检测一个字符串中的多个模式 - python-regex

hadoop - Hive服务因derby连接异常而失败