MapReduce計算の例
1591 ワード
今日は暇で、昔からハドopのインストールファイルがあったので、MapReduceの例を試してみました.ついでに、自分が失ったpythonの開発経験を試してみました.(
例は、「a b c d a b c」と入力された一連の入力であり、MapとReduceとは、実際には2つの計算プロセスであり、最初のプロセスはmapであり、タスクを分割するために使用され、詳細な統計結果を羅列し、コードは以下の通りである.
python解釈器で試してみます
そこで2つ目のプロセスについて議論します.reduceは結果をグループ化してまとめ、最終的な統計結果を得ることです.
再度運行して結果を見ましょう!
ちなみにyieldの概念は、反復中にnextレコードを記録するための最適化スキームである反復器です.
例は、「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レコードを記録するための最適化スキームである反復器です.