MapReduce計算の例

1591 ワード

今日は暇で、昔からハドopのインストールファイルがあったので、MapReduceの例を試してみました.ついでに、自分が失ったpythonの開発経験を試してみました.(
例は、「a b c d a b c」と入力された一連の入力であり、MapとReduceとは、実際には2つの計算プロセスであり、最初のプロセスはmapであり、タスクを分割するために使用され、詳細な統計結果を羅列し、コードは以下の通りである.
import sys

def read_input(file):
    for line in file:
        yield line.split()

def main():
    data = read_input(sys.stdin)

    for words in data:
        for word in words:
            print("%s%s%d"%(word, '\t', 1)) #                   ,    

if __name__ == '__main__':
    main()

python解釈器で試してみます
[training@localhost training_materials]$ echo "a b c d a b c" | python2.7 hdfs_map.py
a   1
b   1
c   1
d   1
a   1
b   1
c   1

そこで2つ目のプロセスについて議論します.reduceは結果をグループ化してまとめ、最終的な統計結果を得ることです.
import sys
from operator import itemgetter
from itertools import groupby

def read_mapper_output(file, separator='\t'):
    for line in file:
        yield line.rstrip().split(separator, 1)

def main():
    data = read_mapper_output(sys.stdin)

    for current_word, group in groupby(data, itemgetter(0)): #    
        total_count = sum(int(count) for current_word, count in group)

        print ("%s%s%d"%(current_word, '\t', total_count))

if __name__ == '__main__':
    main()

再度運行して結果を見ましょう!
[training@localhost training_materials]$ echo "a b c d a b c" | python2.7 hdfs_map.py | sort -k1,1 | python2.7 hdfs_reduce.py
a   2
b   2
c   2
d   1

ちなみにyieldの概念は、反復中にnextレコードを記録するための最適化スキームである反復器です.