使用Hadoop Streaming在Mapper代码中循环两次

时间:2016-10-06 12:40:32

标签: python hadoop hadoop-streaming

我希望在将输出发送到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

0 个答案:

没有答案