将IntWritatble转换为int

时间:2016-05-17 07:37:27

标签: java hadoop mapreduce

我有以下代码,我不明白为什么在突出显示的行中使用了get()方法。如果我删除了get()方法,则会抛出错误。

我可以从中获取:get()方法返回IntWritable的int值。如果我错了,请纠正我。

public void reduce(IntWritable key, Iterator<IntWritable> values, OutputCollector<IntWritable, IntWritable> output, Reporter reporter) throws IOException {
    int sum = 0;
    while (values.hasNext()) {
        sum += values.next().get(); //error when removing the get()    
    }
}

3 个答案:

答案 0 :(得分:7)

您的理解是正确的。 RamPrasad G's answer也是正确的(+1),但是,只是为了更清楚:

sum是int。 valuesIteratorIntWritable元素,因此values.next()IntWritable。现在,IntWritable(hadoop的数据类型)不等同于java的基本类型int,即使它们用于同一事物:存储整数值。

因此,您无法将IntWritable添加到int(如果删除get()方法,则会执行此操作)。它们不是同一类型。您必须将IntWritable转换为int,这是由get()方法完成的。

答案 1 :(得分:4)

为了以Hadoop方式处理Objects,Hadoop使用Writable类。 例如,Hadoop使用Text而不是java的String。类似地,Hadoop中的IntWritable类与java int类似,但IntWritable实现了Comparable,WritableWritableComparable等接口。

这些接口都是MapReduce所必需的; Comparable接口用于比较reducer对密钥进行排序的时间,Writable可以将结果写入本地磁盘。它不使用java Serializable,因为java Serializable对于hadoop而言太大或太重,Writable可以以非常轻的方式序列化hadoop对象。

可写接口描述为

  

一个可序列化的对象,它实现了一个简单,高效,   序列化协议,基于DataInputDataOutput

您的values.next()是IntWritable类,您必须使用get()方法来获取它的原始类型。

答案 2 :(得分:2)

intInteger自动装箱/取消装箱不同,同样不适用于intIntWritable

源代码IntWritable提供了更多详细信息,让您更好地理解概念。

/** A WritableComparable for ints. */
public class IntWritable implements WritableComparable {
  private int value;

  public IntWritable() {}

  public IntWritable(int value) { set(value); }

  /** Set the value of this IntWritable. */
  public void set(int value) { this.value = value; }

  /** Return the value of this IntWritable. */
  public int get() { return value; }

IntWritable是根据int构建的,获取int的唯一方法是使用get() API