我是hadoop的新手。我用python实现了两个表的连接。
一个表格,其中学生信息为stu id和name,另一个表格的成绩信息为stu id,class id和grade。(数据在此问题的最后)
用cat ./data* | python mapper.py | sort | python reducer.py
我得到了正确的答案,但是在hadoop过程中,我收到以下错误:
INFO mapreduce.Job:任务ID:attempt_1456069308240_0019_m_000001_2,状态:未通过 错误:java.lang.RuntimeException:PipeMapRed.waitOutputThreads():子进程失败,代码为2 代码如下:
映射器代码:
import os
import sys
def mapper():
for line in sys.stdin:
if len(line.strip())== 0:
continue
field = line[:-1].split('\t')
if len(field) ==2:
print '%s\t%s\t%s' % (field[0],'0',field[1])
elif len(field) ==3:
print '%s\t%s\t%s\t%s' % (field[0],'1',field[1],field[2])
if __name__=='__main__':
mapper()
reducer code:
def reducer():
lastsno=""
for line in sys.stdin:
if len(line.strip())== 0:
continue
field = line[:-1].split('\t')
sno = field[0]
if sno != lastsno:
name = ""
if field[1] == "0":
name = field[2]
elif sno == lastsno:
if field[1] == "1":
courseno =field[2]
grade = field[3]
if name:
print '%s\t%s\t%s\t%s' % (lastsno,name,courseno,grade)
lastsno = sno
if __name__=='__main__':
reducer()
数据正好在
之下datainfo:
2014211011 taiyuan
2014211012 tiantian
2014211013 kk
2014211014 tank
2014211015 lc
2014211016 wjs
2014211017 gyc
2014211018 hd
2014211019 cx
data_grade:
2014211012 011 80
2014211012 012 95
2014211013 011 40
2014211014 013 38
2014211011 011 35
2014211013 022 40
2014211015 011 80
使用上面的cat python脚本,我可以在下面得到正确答案:
2014211011 taiyuan 011 35
2014211012 tiantian 011 80
2014211012 tiantian 012 95
2014211013 kk 011 40
2014211013 kk 022 40
2014211014 tank 013 38
2014211015 lc 011 80
但是hadoop中的错误,请帮助我,谢谢。