我正在尝试编写一个MapReduce应用程序,其中Mapper将一组值传递给Reducer,如下所示:
您好
世界
你好
你好
世界
您好
现在首先对这些值进行分组和计数,然后进行一些进一步的处理。我写的代码是:
public void reduce(Text key, Iterable<Text> values, Context context)
throws IOException, InterruptedException {
List<String> records = new ArrayList<String>();
/* Collects all the records from the mapper into the list. */
for (Text value : values) {
records.add(value.toString());
}
/* Groups the values. */
Map<String, Integer> groupedData = groupAndCount(records);
Set<String> groupKeys = groupedData.keySet();
/* Writes the grouped data. */
for (String groupKey : groupKeys) {
System.out.println(groupKey + ": " + groupedData.get(groupKey));
context.write(NullWritable.get(), new Text(groupKey + groupedData.get(groupKey)));
}
}
public Map<String, Integer> groupAndCount(List<String> records) {
Map<String, Integer> groupedData = new HashMap<String, Integer>();
String currentRecord = "";
Collections.sort(records);
for (String record : records) {
System.out.println(record);
if (!currentRecord.equals(record)) {
currentRecord = record;
groupedData.put(currentRecord, 1);
} else {
int currentCount = groupedData.get(currentRecord);
groupedData.put(currentRecord, ++currentCount);
}
}
return groupedData;
}
但是在输出中我得到的数量为1。 sysout语句的打印类似于:
您好
世界
你好:1
世界:1
你好
你好:1
你好
世界
你好:1
世界:1
嗨
嗨:1
我无法理解问题是什么,为什么不立即收到Reducer的所有记录并传递给groupAndCount
方法。
答案 0 :(得分:0)
正如您在评论中注意到的,如果每个值都有不同的相应键,那么它们将不会在同一个reduce调用中减少,并且您将获得当前看到的输出。
Hadoop Reducer的基本原理是,对于相同的密钥,将收集和减少值的概念 - 我建议您重新阅读一些Hadoop入门文档,特别是Word Count示例,这看起来与您大致相同试图用你的代码实现。