Python Spark处理电影数据时出现List index out of range错误求助
解决Spark处理电影数据时的List Index Out of Range错误
别慌,这个问题我在处理Spark文本数据时踩过好几次!List index out of range本质就是你要访问的索引位置在分割后的列表里不存在——大概率是你的u.item文件里混了格式不规范的行:比如空行、分隔符|数量不够的行,或者某些行的字段直接缺失了。
核心解决思路:先过滤无效行,再处理有效数据
我们可以先把不符合格式的行过滤掉,再提取日期和统计年份,具体代码如下:
# 读取原始文件 lines = sc.textFile("file:///u.item") # 第一步:过滤掉分割后元素不足3个的行(避免取索引2时越界) valid_lines = lines.filter(lambda x: len(x.split('|')) >= 3) # 第二步:提取日期字段,再拆分出年份 year_tuples = valid_lines.map(lambda x: (x.split('|')[2].split('-')[2], 1)) # 第三步:按年份统计数量 year_counts = year_tuples.reduceByKey(lambda a, b: a + b) # 打印结果 year_counts.collect()
优化小技巧:减少重复split操作
上面的代码里x.split('|')执行了两次,有点浪费性能。可以改成只分割一次,提升效率:
year_counts = lines.filter(lambda x: len(x.split('|')) >= 3) \ .map(lambda x: x.split('|')) \ .map(lambda fields: (fields[2].split('-')[2], 1)) \ .reduceByKey(lambda a, b: a + b)
排查异常数据(可选)
如果你想知道到底是哪些行出了问题,可以先收集无效行看看:
invalid_lines = lines.filter(lambda x: len(x.split('|')) < 3) print("无效行内容:", invalid_lines.collect())
这样就能彻底解决索引越界的问题,顺利完成按年份统计电影数量的需求啦~
内容的提问来源于stack exchange,提问作者TheSaurus
相关产品推荐
相关产品推荐

