我有带前缀的单词。如:
city|new york
city|London
travel|yes
...
city|new york
我想数数有多少 city|new york
以及 city|London
(这是经典的字数)。但是,减速机输出应该是一个键对,如 city:{"new york" :2, "london":1}
. 对每个人的意义 city
前缀,我要聚合所有字符串及其计数。
public void reduce(Text key, Iterable<IntWritable> values,
Context context
) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
// Instead of just result count, I need something like {"city":{"new york" :2, "london":1}}
context.write(key, result);
}
有什么想法吗?
2条答案
按热度按时间drkbr07n1#
很简单。
使用“city”作为输出键,整个记录作为输出值,从mapper发出。
你将城市划分为一个单一的小组在一个减速机和旅行作为另一组。
使用hash-map对城市和旅游示例进行统计,并将其细化到较低的级别。
4jb9z9bj2#
你可以用
cleanup()
减速机的方法来实现这一点(假设您只有一个减速机)。在reduce任务结束时调用一次。我将为“城市”数据解释这一点。
代码如下:
Map器:
它只输出它遇到的每个键的计数。例如,如果它遇到记录“city | new york”,那么它将输出(key,value)为(“city | new york”,1)
减速器:
对于每条记录,它检查键是否包含“city |”。它将管道上的键(“|”)拆分。并将每个城市的计数存储在hashmap中。
减速器也覆盖
cleanup
方法。reduce任务完成后,将调用此方法。在这个任务中,hashmap的内容被合成到所需的输出中。在
cleanup()
,键作为hashmap的内容输出,值作为空字符串输出。例如,我将以下数据作为输入:
我得到了以下输出: