码迷,mamicode.com
首页 > 编程语言 > 详细

【转】用python写MapReduce函数——以WordCount为例

时间:2015-01-29 20:57:30      阅读:267      评论:0      收藏:0      [点我收藏+]

标签:

本例中直接用python写一个MapReduce实例:统计输入文件的单词的词频

使用python写MapReduce的“诀窍”是利用Hadoop流的API,通过STDIN(标准输入)、STDOUT(标准输出)在Map函数和Reduce函数之间传递数据。

我们唯一需要做的是利用Python的sys.stdin读取输入数据,并把我们的输出传送给sys.stdout。Hadoop流将会帮助我们处理别的任何事情。

1、map函数(mapper.py

#!/usr/bin/env python
import sys
for line in sys.stdin:
    line = line.strip()
    words = line.split()
    for word in words:
        print "%s\t%s" % (word, 1)

文件从STDIN读取文件。把单词切开,并把单词和词频输出STDOUT。Map脚本不会计算单词的总数,而是输出<word> 1。在我们的例子中,我们让随后的Reduce阶段做统计工作。

2、reduce函数(reducer.py

#!/usr/bin/env python
from operator import itemgetter
import sys

current_word = None
current_count = 0
word = None

for line in sys.stdin:
    line = line.strip()
    word, count = line.split(\t, 1)
    try:
        count = int(count)
    except ValueError:  #count如果不是数字的话,直接忽略掉
        continue
    if current_word == word:
        current_count += count
    else:
        if current_word:
            print "%s\t%s" % (current_word, current_count)
        current_count = count
        current_word = word

if word == current_word:  #不要忘记最后的输出
    print "%s\t%s" % (current_word, current_count)

文件会读取mapper.py 的结果作为reducer.py 的输入,并统计每个单词出现的总的次数,把最终的结果输出到STDOUT。

细节:split(‘\t‘, 1),表示只截取一次

3、执行

(1)本地测试

cat input | python mapper.py | sort -k1,1| python reducer.py

(2)hadoop测试

/home/work/tools/hadoop/bin/hadoop streaming \
-Dmapred.job.name="test-job" \
-Dmapred.job.priority=NORMAL \
-Dmapred.reduce.tasks=1 \
-mapper ‘python mapper.py‘ \
-reducer ‘python reducer.py‘ \
-file /home/work/code/mapper.py \
-file /home/work/code/reducer.py \
-input hdfs://data/input \
-output hdfs://data/output

 

【转】用python写MapReduce函数——以WordCount为例

标签:

原文地址:http://www.cnblogs.com/apple-flying/p/4260806.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!