实验名称
求出各部门人员名单
实验目的
1、熟练理解和掌握MapReduce编程模型
2、掌握使用其他语言实现MapReduce
实验原理
http://hadoop.apache.org/docs/r1.0.4/cn/streaming.html
实验环境
Ubuntu 16.04
Hadoop 2.7.3
Python 3.6
python代码编写
1、创建map.py文件
自行编程完成,实现要点:
逐行读取上一步两个文件的内容
分割成数据列表后,根据列表长度判断是员工表还是部门表
期望输出:部门编号,员工姓名或部门名称
(为区分后者是员工姓名还是部门姓名,可在部门名称前加个符号,如*)
代码粘贴:
import sys
for line in sys.stdin:
col = line.strip().split(',')
if len(col)<=3:
print(col[0], ",",'*',",", col[1])
else:
print(col[7], ",", col[1])
2、创建reduce.py文件
自行编程完成,实现要点:
逐行读取上一步的文件内容
按部门编号进行分组
遍历各个分组,如果带号就去掉号作为部门名字,否则就作为员工名字
期望输出:部门名字,一列员工名字(自选标点符号连接)
代码粘贴:
#!/bin/env python
encoding: utf-8
from operator import itemgetter
import itertools
import sys
def read_mapper_output(file, separator = ','):
for line in file:
yield line.rstrip().split(separator,1)
stdin_generator=read_mapper_output(sys.stdin, ',')
for depno, sals in itertools.groupby(stdin_generator,itemgetter(0) ):
data = ""
data1=""
count=""
for depno,value in sals:
if "*" in value:
data=value [5:]
else:
data1=value [1:]
count=data1+"\t"+count
print(data,":",count)
本地管道测试
cat emp.csv dept.csv| python map.py | sort -k 1 | python reduce.py