MapReduce(Python)如何对TopN列表的reducer输出进行排序?

2024-04-28 08:10:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我对MapReduce很陌生。目前正在尝试完成Hadoop MapReduce上的udacity课程。

我有一个解析论坛节点的映射器,我将获得与每个节点相关联的标记。我的目标是对前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

我知道键是在映射器的输出中排序的,因此我只测试键是否仍然是相同的标记。如果没有,那么我将输出标记出现的次数。

但是,问题是如何对列表进行排序?

如果将所有信息存储在列表或字典中,我可以用python对列表进行排序。然而,这似乎是一个糟糕的设计决定,因为如果你有很多不同的标签,你会失去记忆。


Tags: key标记列表dataif节点排序line