我有以下代码,我不明白为什么在突出显示的行中使用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。values
是Iterator
到IntWritable
元素,所以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对象。
可写接口被描述为
一种可串行化的对象,基于
DataInput
和DataOutput
的串行化协议
您的values.next()
是IntWritable类,您必须使用get()
方法来获取它的基元类型。
与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