您的位置:首页 > 编程语言 > Python开发

Python+Hadoop Streaming实现MapReduce(如何给map和reduce的脚本传递参数)

2015-01-15 19:53 726 查看
1. 上一篇我们提到用python 和 hadoop streaming的方式写mapreduce,那么我们怎么向map和reduce的脚本传递参数呢,本来着重讲这个

2. 我们知道用java写mapreduce的时候可以传参数给map或者reduce,具体的就是用Configuration去set值,然后在map或者reduce端用get进行获取,这个就不多说了,不是本文重点

3. 不多说,直接贴出来,

#!/bin/bash

hadoop fs -rmr trans_record/result

hadoop jar ./hadoop-streaming-2.0.0-mr1-cdh4.7.0.jar \
-input $1 \
-output trans_record/result \
-file map.py \
-file reduce.py \
-mapper "python map.py" \
-reducer "python reduce.py" \
-jobconf mapred.reduce.tasks=1 \
-jobconf mapred.job.name="qianjc_trans_record" \
-cmdenv "card_start=$2" \
-cmdenv "card_last=$3" \
-cmdenv "trans_at=$4"


我们可以看到比上一篇介绍的多了-cmdenv 其实这个就是传参数的配置项,那么我们在map或者reduce中怎么取呢,如下:

#!/usr/bin/env python
# vim: set fileencoding=utf-8
import sys
import os

def main():
card_start = os.environ.get('card_start')
card_last = os.environ.get('card_last')
trans_at = float(os.environ.get('trans_at'))

for line in sys.stdin:
detail = line.strip().split(',')
card = detail[0]
money = float(detail[17])
if trans_at == money and card_start == card[1 : 7] and card_last == card[-4 : ]:
print '%s\t%s' % (line.strip(), detail[1])

if __name__ == '__main__':
main()


os模块可以取,给一个key就相应得能取到key对应的value

4. 这还是很简单的,但是这个却应该熟练掌握,毕竟比较重要
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: