我试图在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 type?。只是好奇。谢谢您的帮助。
答案 0 :(得分:0)
简短回答:VALUES中的类型可以是实现Writable接口的任何类型。例如,IntWritable,LongWritable,Text等。这些都在org.apache.hadoop.io包中。你可以创建自己的。
这个定义告诉你,你将使用2个参数调用reduce()方法的实现:一个键(一个参数化类型)和一个值集合(也是一个参数化类型)。集合实现对您来说是隐藏的;你不在乎它如何收集。但是调用允许您通过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()并获取集合中的值数。那是因为你正在处理一个潜在的庞大的价值观集合,其长度是不确定的。这是大数据,宝贝!