Spark SQL将datetime.date对象误解析为数学表达式或整数的问题
问题原因
当用Python的str.format()把datetime.date对象插入Spark SQL语句时,date对象会被转成无引号的字符串(比如2022-10-01)。Spark SQL会把这个字符串解析成数学表达式2022 - 10 - 1,得到整数2011,而你的IncidentCreatedDate是date类型,类型不匹配导致报错。
解决方案
以下是几种可行的解决方法:
1. 给日期字符串添加引号
将datetime.date对象转为字符串后包裹单引号,让Spark识别为date字面量:
df = spark.sql(""" SELECT * FROM table_A WHERE IncidentCreatedDate < '{}' """.format(first_day_of_month))
也可以用isoformat()确保日期格式标准:
df = spark.sql(""" SELECT * FROM table_A WHERE IncidentCreatedDate < '{}' """.format(first_day_of_month.isoformat()))
2. 使用Spark内置日期函数生成当月第一天
直接在Spark SQL中计算当月第一天,避免Python日期对象的转换问题:
df = spark.sql(""" SELECT * FROM table_A WHERE IncidentCreatedDate < date_trunc('month', current_date()) """)
date_trunc('month', current_date())会直接返回当前月份的第一天,类型为date,无需额外转换。
3. 使用参数化查询(推荐,避免SQL注入)
通过spark.sql()的args参数传递日期值,Spark会自动处理类型转换:
df = spark.sql(""" SELECT * FROM table_A WHERE IncidentCreatedDate < ? """, args=(first_day_of_month,))
或者用DataFrame API结合lit函数实现:
from pyspark.sql.functions import col, lit df = spark.table("table_A").filter(col("IncidentCreatedDate") < lit(first_day_of_month))
内容的提问来源于stack exchange,提问作者datawrangler
相关产品推荐
相关产品推荐

