hadooppython入门,让python在hadoop上跑起来

本文实例讲解的是一般的hadoop入门程序“WordCount”,就是首先写一个map程序用来将输入的字符串分割成单个的单词,然后reduce这些单个的单词,相同的单词就对其进行计数,不同的单词分别输出,结果输出每一个单词出现的频数。

注意:关于数据的输入输出是通过sys.stdin(系统标准输入)和sys.stdout(系统标准输出)来控制数据的读入与输出。所有的脚本执行之前都需要修改权限,否则没有执行权限,例如下面的脚本创建之前使用“chmod +x mapper.py”

1.mapper.py

#!/usr/bin/env python

import sys

for line in sys.stdin: # 遍历读入数据的每一行

line = line.strip() # 将行尾行首的空格去除

words = line.split() #按空格将句子分割成单个单词

for word in words:

print '%st%s' %(word, 1)

2.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:

words = line.strip() # 去除字符串首尾的空白字符

word, count = words.split('t') # 按照制表符分隔单词和数量

try:

count = int(count) # 将字符串类型的‘1'转换为整型1

except ValueError:

continue

if current_word == word: # 如果当前的单词等于读入的单词

current_count += count # 单词频数加1

else:

if current_word: # 如果当前的单词不为空则打印其单词和频数

print '%st%s' %(current_word, current_count)

current_count = count # 否则将读入的单词赋值给当前单词,且更新频数

current_word = word

if current_word == word:

print '%st%s' %(current_word, current_count)

在shell中运行以下脚本,查看输出结果:

echo "foo foo quux labs foo bar zoo zoo hying" | /home/wuying/mapper.py | sort -k 1,1 | /home/wuying/reducer.py

# echo是将后面“foo ****”字符串输出,并利用管道符“|”将输出数据作为mapper.py这个脚本的输入数据,并将mapper.py的数据输入到reducer.py中,其中参数sort -k 1,1是将reducer的输出内容按照第一列的第一个字母的ASCII码值进行升序排序

其实,我觉得后面这个reducer.py处理单词频数有点麻烦,将单词存储在字典里面,单词作为‘key’,每一个单词出现的频数作为’value’,进而进行频数统计感觉会更加高效一点。因此,改进脚本如下:

mapper_1.py

d2159bdd56dcaba07628ac059f0afe96.png

但是,貌似写着写着用了两个循环,反而效率低了。关键是不太明白这里的current_word和current_count的作用,如果从字面上老看是当前存在的单词,那么怎么和遍历读取的word和count相区别?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值