我是mapreduce的新手。目前正在尝试完成hadoopmapreduce上的udacity课程。
我有一个解析论坛节点的Map器,我将获得与每个节点相关联的标签。我的目标是对前10个标签进行排序。
输出示例:
video 1
cs101 1
meta 1
bug 1
issues 1
nationalities 1
cs101 1
welcome 1
cs101 1
cs212 1
cs262 1
cs253 1
discussion 1
meta 1
在减速机中添加它们非常容易:
# !/usr/bin/python
import sys
import string
total = 0
oldKey = None
for line in sys.stdin:
data_mapped = line.strip().split("\t")
if(len(data_mapped) != 2):
print "====================="
print line.strip()
print "====================="
continue
key, value = data_mapped
if oldKey and oldKey != key:
print total, "\t", oldKey
oldKey = key;
total = 0
oldKey = key
total += float(value)
if oldKey != None:
print total, "\t", oldKey
输出:
1.0 application
1.0 board
1.0 browsers
1.0 bug
8.0 cs101
1.0 cs212
5.0 cs253
1.0 cs262
1.0 deadlines
1.0 digital
5.0 discussion
1.0 google-appengine
2.0 homework
1.0 html
1.0 hungarian
1.0 hw2-1
3.0 issues
2.0 jobs
2.0 lessons
我知道键是在Map器的输出中排序的,因此我只测试键是否仍然是相同的标记。如果不是,则输出标记出现的次数。
但是,问题是如何对该列表排序?
如果我将所有信息存储在列表或字典中,我可以用python对列表进行排序。然而,这似乎是一个糟糕的设计决定,因为如果你有很多不同的标签,你会去内存。
1条答案
按热度按时间lbsnaicq1#
我相信您可以在这里使用collections.counter类:
示例:(根据代码修改)
这个
collections.Counter()
类实现了这个确切的用例和许多其他常见的用例,包括计数和收集各种统计数据等。8.3.1. 计数器对象提供计数器工具以支持方便快速的计数。例如: