最近在学了python了,从mapReduce开始 ,话不多说了,直接上代码了哈

 

map阶段,map.py文件

 1 import sys
 2 
 3 # 标准输入
 4 # 在终端的话,就需要这样了 cat a.txt | python map_new.py,通过一个管道的形式进行标准输入
 5 # strip 就是避免字符串前后有回车或者是隐含字符,一般对于字符串都要strip() 一下。
 6 
 7 for line in sys.stdin:
 8     # print(line.strip())
 9     ss = line.strip().split(' ')
10     for word in ss:
11         # word和1之间用制表符进行分割
12         print('\t'.join([word.strip(),'1']))

 

reduce阶段:reduce.py文件

map到reduce阶段要做一个排序,相同的key放到了一起

 1 import sys
 2 
 3 cur_word = None
 4 sum = 0
 5 
 6 for line in sys.stdin:
 7     ss = line.strip().split('\t')
 8     if len(ss) != 2:
 9         continue
10     word,cnt = ss
11 # 当读取第一行时,cur_word肯定是None吧
12     if cur_word == None:
13         cur_word = word
14     if cur_word != word:
15         # 当 cur_word 和 word不相等时,将其输出
16         print('\t'.join([cur_word,str(sum)]))
17         cur_word = word
18         sum = 0
19 
20     sum += int(cnt)
21 # 对最后一行进行输出
22 print('\t'.join([cur_word,str(sum)]))

 

还需要一个run.sh

HADOOP_CMD="/usr/local/src/hadoop-1.2.1/bin/hadoop"
STREAM_JAR_PATH="/usr/local/src/hadoop-1.2.1/contrib/streaming/hadoop-streaming-1.2.1.jar"

INPUT_FILE_PATH_1="/1.data"
OUTPUT_PATH="/output"

$HADOOP_CMD fs -rmr -skipTrash $OUTPUT_PATH

# Step 1.
$HADOOP_CMD jar $STREAM_JAR_PATH \
    -input $INPUT_FILE_PATH_1 \
    -output $OUTPUT_PATH \
    -mapper "python map.py" \
    -reducer "python reduce.py" \
    -file ./map_new.py \
    -file ./red_new.py

# HADOOP_CMD: hadoop的bin的路径
# STREAM_JAR_PATH:streaming jar包的路径
# INPUT_FILE_PATH:hadoop集群上的资源输入路径
# OUTPUT_PATH:hadoop集群上的结果输出路径

 

执行和查看 

# cat data.txt | pyton map.py | sort -k1 | python reduce.py > result.txt
# cat result.txt | sort -k2 -rn | head

写的比较简单哈

 

posted on 2019-04-21 00:32  风清_云淡  阅读(348)  评论(0编辑  收藏  举报