我试图理解MapReduce程序中Reducer的reduce方法中Iterable的用法。方法的签名是
protected void reduce(KEYIN key,
Iterable<VALUEIN> values,
org.apache.hadoop.mapreduce.Reducer.Context context)
throws IOException,
InterruptedException
我的问题是关于Iterable值。值是否为List类型、Set类型?只是好奇。谢谢你的帮助。
简短的回答:VALUES中的类型可以是实现Writable接口的任何类型。例如,不可写的,长可写的,文本等。它们位于org.apache.hadoop.io包中。你也可以创造你自己的。
这个定义告诉你,你的reduce()方法的实现将被2个参数调用:一个键(参数化类型)和一个值集合(也是参数化类型)。集合的实现是隐藏的;你不关心它是如何收集的。但是该调用允许您通过Iterable接口访问该集合,这简单地意味着您可以使用for (VALUEIN val: values)
循环一次一个地遍历这些值。
例如,假设您实现了一个接收LongWritable键和Text值的reducer。你的reduce方法看起来像这样:
public void reduce(LongWritable key, Iterable<Text> values){...
...
for (Text word: values) {
...do something with word...
}
您将注意到values参数没有为您提供size()方法,因此您不能通过values.size()来获取集合中值的数量。这是因为您正在处理一个长度不确定的值的潜在庞大集合。这是大数据,宝贝!