PySpark中如何用OR子句过滤日期?解决逻辑运算报错
PySpark日期过滤错误修正方案
错误原因
你遇到的报错是运算符优先级导致的:&(逻辑与)的优先级比==高,代码里的col("status") == 1 & date_filter_condition会被解析成col("status") == (1 & date_filter_condition),这相当于把整数1和Spark的列表达式做位运算,完全不符合你的逻辑,所以抛出方法不存在的错误。
修正步骤
1. 给条件添加括号(最直接的修复)
把col("status") == 1用括号括起来,明确运算顺序:
# 原错误代码 lookup = hive_context.table("MY_TABLE").filter(col("status") == 1 & date_filter_condition) # 修正后 lookup = hive_context.table("MY_TABLE").filter( (col("status") == 1) & date_filter_condition )
2. 优化日期处理(更规范的写法)
你用Python的date.today()转字符串的方式存在时区风险(本地时区和Spark集群时区可能不一致),推荐用PySpark内置的current_date()函数直接生成日期类型,无需字符串转换:
# 导入current_date函数 from pyspark.sql.functions import col, concat_ws, collect_list, current_date # 替换日期生成和过滤条件 date_filter_condition = (col("created") >= current_date()) | (col("updated") >= current_date()) # 过滤逻辑(注意括号) lookup = hive_context.table("MY_TABLE").filter( (col("status") == 1) & date_filter_condition )
补充说明
- 如果你的
created和updated字段是字符串类型(而非日期类型),可以先用to_date()转换后再比较:from pyspark.sql.functions import to_date date_filter_condition = (to_date(col("created"), "yyyy-MM-dd") >= current_date()) | (to_date(col("updated"), "yyyy-MM-dd") >= current_date()) - 逻辑运算符推荐用
&/|(对应Spark的逻辑与/或),注意和Python的and/or区分,后者不能用于Spark列表达式。
内容的提问来源于stack exchange,提问作者Marcos Guimaraes
相关产品推荐
相关产品推荐

