我希望在将输出发送到reducer python代码之前组合多个数据集。以下是我的数据集:
student.dat
studentid:gender:age
grades.dat
studentid:subjectid:grade:semester:schoolyear
subject.dat
subjectid:name
我想生成这样的输出:
studentid gender name grade
为了产生上面的输出,我想到运行2 for循环所以我可以先保存到主题数据集的dict然后我将结合学生和成绩数据集,然后在打印输出之前,我将检索来自dict的主题名称,所以我可以将它与其他值放在一起,以产生我需要发送到我的reducer的最终结构。
这是代码:
mappper.py
#!/usr/bin/env python
import sys
subjectDict = {}
for line in sys.stdin:
line = line.strip()
line = line.split(":")
if len(line) == 2:
#subject
subjectDict[line[0]] = line[1]
for line in sys.stdin:
line = line.strip()
line = line.split("::")
if len(line) == 3:
#student
studentid = line[0]
gender = line[1]
elif len(line) == 5:
#grades
studentid = line[0]
subjectid = line[1]
grade = line[2]
name = subjectDict.get(subjectid)
print '%s|%s|%s|%s' % (studentid, gender, name, grade)
当我在本地运行它(使用cat)时,我没有得到任何输出。它看起来像是第一个正在执行的循环。我对python hadoop流媒体还不是很熟悉。我在这里错过了什么?我在这里唯一的限制是,我需要在一个python映射器代码中写这个。
如何加入这些数据集?
顺便说一下,只是为了增加信息,这将是减速器的输出
Reducer输出可能是(性别名称average_grade):
F Mathematics 4.8
M Science 4.5