运行AWS Glue DataFrame过滤代码时触发ValueError:无法将列转换为布尔值的技术咨询
解决PySpark DataFrame布尔表达式构建的ValueError问题
这个错误的核心原因是你在PySpark的Column表达式里误用了Python原生的in运算符,我来帮你修正代码并拆解问题所在:
错误根源
PySpark的Column对象并不支持Python原生的in语法来判断值是否在集合中——这个语法只能用于Python原生容器(比如列表、元组),不能直接用来生成DataFrame的过滤布尔表达式。另外要注意,&的运算符优先级高于==,所以每个单独的过滤条件必须用括号明确包裹,避免运算顺序混乱(你原来的代码这部分是对的,主要问题出在in的使用上)。
修正后的完整代码
import pyspark.sql.functions as f retail_sales_transaction = glueContext.create_dynamic_frame.from_catalog( database="conform_main_mobconv", table_name="retail_sales_transaction" ) df_retail_sales_transaction = (retail_sales_transaction.toDF() .filter( (f.col('dh_audit_source_system_id') == 'SRC_JDAESO') & (f.col('country_code').isin('AU', 'NZ')) ) .select( "transaction_id", "transaction_key", "transaction_timestamp", "personnel_key", "retail_site_id", "personnel_role", "country_code", "business_week", "dh_audit_start_timestamp" ) )
关键修改点
- 替换
in为isin()方法:把f.col('country_code') in ('AU','NZ')改成f.col('country_code').isin('AU', 'NZ')。isin()是PySpark Column API专门提供的方法,用于实现SQL中IN的逻辑,能正确生成布尔过滤表达式。 - 保留条件的括号包裹:每个条件都用
()括起来,确保&运算只会在两个完整的布尔条件之间进行,避免因运算符优先级导致的隐性错误。
这样修改后,你的过滤逻辑就能正确执行,不会再抛出ValueError了。
内容的提问来源于stack exchange,提问作者Sonam Garg
相关产品推荐
相关产品推荐

