Python编写Hadoop MapReduce时reducer行拆分异常问题求助
问题根因及修复方案
1. 核心错误:制表符转义字符写错
你代码中的line.split('/t', 1)使用了正斜杠+字母t,对应普通的/t字符串,并非制表符的转义字符。Python中制表符的正确转义写法为反斜杠+字母t,也就是\t。
由于拆分失败,item列表只会保留1个元素(即整行内容),后续执行person,connections = item变量解包操作时,就会触发值数量不匹配的报错。
2. 兼容优化建议
为了避免mapper输出脏行导致程序崩溃,以及提升运行效率,可做两处优化:
- 拆分后先校验
item长度,不符合要求的行直接跳过 connections拆分结果提前存储,无需重复拆分三次
item = line.split('\t', 1) # 新增长度校验 if len(item) != 2: continue person, connections = item # 提前存储拆分结果避免重复计算 conn_parts = connections.split(":", 1)
3. 修复后完整reducer代码
#!/usr/bin/python3.6 import sys for line in sys.stdin: line = line.strip() # 把原来的'/t'修正为'\t' item = line.split('\t', 1) if len(item) != 2: continue person, connections = item output = person + ":" conn_parts = connections.split(":", 1) if len(conn_parts[0]) > 0: output += f"Might({conn_parts[0]})" if len(conn_parts) > 1 and len(conn_parts[1]) > 0: output += f" Probably({conn_parts[1]})" print(output)
内容的提问来源于stack exchange,提问作者Feverish123
相关产品推荐
相关产品推荐

