我有以下代码,我不明白为什么在突出显示的行中使用了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()
}
}
答案 0 :(得分:7)
您的理解是正确的。 RamPrasad G's answer也是正确的(+1),但是,只是为了更清楚:
sum
是int。 values
是Iterator
到IntWritable
元素,因此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,Writable和WritableComparable等接口。
这些接口都是MapReduce所必需的; Comparable
接口用于比较reducer对密钥进行排序的时间,Writable
可以将结果写入本地磁盘。它不使用java Serializable
,因为java Serializable
对于hadoop而言太大或太重,Writable
可以以非常轻的方式序列化hadoop对象。
可写接口描述为
一个可序列化的对象,它实现了一个简单,高效, 序列化协议,基于
DataInput
和DataOutput
您的values.next()
是IntWritable类,您必须使用get()
方法来获取它的原始类型。
答案 2 :(得分:2)
与int
和Integer
自动装箱/取消装箱不同,同样不适用于int
和IntWritable
。
源代码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