将IntWritable转换为int



我有以下代码,我不明白为什么在突出显示的行中使用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()    
    }
}

您的理解是正确的。RamPrasad G的答案也是正确的(+1),但是,只是为了让它更清楚:

sum是int。valuesIteratorIntWritable元素,所以values.next()IntWritable。现在,hadoop的数据类型IntWritable与java的基元类型int并不等价,即使它们用于存储整数值。

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

为了以Hadoop的方式处理对象,Hadoop使用了可写类。例如,Hadoop使用Text而不是java的String。类似地,Hadoop中的IntWritable类类似于javaint,但是IntWritaable实现了Comparable、Writable和WritableComparable等接口。

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

可写接口被描述为

一种可串行化的对象,基于DataInputDataOutput 的串行化协议

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

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

相关内容

  • 没有找到相关文章

最新更新