使用MRJob时字符串转整数失败问题求助
问题分析与解决
错误原因很明确:你的CSV文件第一行是表头(包含'yearID'这个字段名),但代码没有跳过这一行,导致mapper把表头行也当成数据行处理,生成了一个yearID值为字符串'yearID'的字典,传到reducer后执行int('yearID')时触发ValueError。
解决方法
在mapper函数开头添加判断,跳过表头行即可。因为你的CSV第一列是playerID,表头行的第一列就是这个字符串,所以可以通过这个条件判断:
修改后的mapper代码:
def mapper(self, _, line): row = line.split(",") # 跳过CSV表头行 if row[0] == 'playerID': return playerID = row[0] whip = { "p_H": row[13], "p_BB": row[16], "p_IPOUTS": row[12], "yearID": row[1] } yield playerID, whip
额外建议
- 若CSV存在换行或格式不规范的情况,可以用Python内置的
csv模块来读取行,比直接split(",")更可靠,能自动处理带引号的逗号等特殊情况。 - 在转换
yearID为整数时,可以添加异常捕获,避免因数据格式错误导致程序崩溃,比如:
try: year = int(stat.get("yearID")) except ValueError: continue # 跳过格式错误的行
内容的提问来源于stack exchange,提问作者Joe Cranney
相关产品推荐
相关产品推荐

