Spark(Python)使用Lambda过滤RDD空字符串元素时countC报错问题
报错原因
- 运算符使用错误:Python中位运算符
&的优先级远高于比较运算符,你代码中没有加括号区分运算顺序,会先执行'201') & (x.split这类逻辑完全不合法的运算,直接触发类型错误。实际逻辑判断应该使用逻辑运算符and。 - 索引越界风险:你直接通过
x.split(",")[2]取第三个字段,如果某条记录的逗号数量不足2个,拆分后列表长度小于3,就会触发IndexError导致程序崩溃。 - 空值判断逻辑无效:字符串按逗号拆分后,第三个字段如果没有内容只会是空字符串
'',永远不可能等于None,你写的x.split(",")[2] != None没有任何实际过滤作用。
正确实现
你可以直接使用下方的代码完成统计,还增加了评论内容去前后空格的判断,避免仅含空格的无效内容被保留:
# 原始总记录数 countA = rdd.count() # 仅过滤日期符合条件的记录数 countB = rdd.filter(lambda x: x.startswith('201')).count() # 同时满足日期、评论非空两个条件的记录数 def valid_line(line): # 先判断日期是否符合要求 if not line.startswith('201'): return False # 最多拆分2次,避免评论内容中存在逗号导致拆分错误 parts = line.split(',', 2) # 判断是否存在第三个字段,且去空格后有实际内容 return len(parts) >= 3 and len(parts[2].strip()) > 0 countC = rdd.filter(valid_line).count()
内容的提问来源于stack exchange,提问作者user2829319
相关产品推荐
相关产品推荐

