Python3中Filter使用Lambda参数报错:无效参数非字符串或列
问题排查思路
- 首先确认报错来源:该报错并非原生Python 3的
filter函数抛出,而是PySpark环境下,你导入了pyspark.sql.functions.filter覆盖了Python内置的filter函数导致的。原生Python 3的filter函数报错不会提示使用lit、struct等Spark专属方法,这是典型的PySpark方法调用参数不匹配的报错。 - 验证方法:在报错代码行前执行
print(filter),如果输出结果关联PySpark模块,即可确认命名冲突问题。
解决方案
推荐优先选择无冲突的列表推导式写法,兼容性最强:
m = [mapping for mapping in rule['mappings'] if mapping.get('action') in ['lookup']]
其他可选方案:
- 明确调用Python内置
filter函数
m = list(__builtins__.filter(lambda mapping: mapping.get('action') in ['lookup'], rule['mappings']))
- 调整PySpark导入规则,避免命名覆盖
修改导入语句,给PySpark的filter设置别名:
# 不要使用 from pyspark.sql.functions import * 这种全量导入方式 from pyspark.sql.functions import filter as spark_filter # 后续原生filter不受影响,Spark过滤操作使用spark_filter调用
内容的提问来源于stack exchange,提问作者Sidd
相关产品推荐
相关产品推荐

