Spark中日期字符串比较不符合预期问题排查
正确实现Spark日期字符串筛选的方法
问题根源
- 直接字符串比较的问题:你直接用字符串
"30/12/2021"和col("date")比较,本质是按字典序对比,不是日期逻辑。比如"30"开头的字符串比"01"开头的大,所以01/01/2022会被错误保留。 - 日期转换的错误:你用
cast(StartDate as date)时犯了两个错:一是列名写错(你的列是date不是StartDate);二是Spark默认的cast只识别yyyy-MM-dd格式,你的日期是MM/dd/yyyy,转换后会变成null,自然筛选不出结果。
正确解决方案
用Spark的to_date函数,指定日期格式把字符串转成日期类型后再做比较:
from pyspark.shell import spark from pyspark.sql.functions import col, to_date from pyspark.sql.types import StructType, StructField, StringType, IntegerType data2 = [(1, 2,"01/01/2022"), (1, 3,"01/01/2021"), (2, 4,"12/20/2021"), ] schema = StructType([ StructField("a", IntegerType(), True), StructField("b", IntegerType(), True), StructField("date", StringType(), True), ]) df = spark.createDataFrame(data=data2, schema=schema) # 转换日期格式并筛选 df.filter(to_date(col("date"), "MM/dd/yyyy") > to_date("30/12/2021", "MM/dd/yyyy")).show()
代码解释
to_date(col("date"), "MM/dd/yyyy"):把date列的字符串按月/日/年格式转成日期类型。to_date("30/12/2021", "MM/dd/yyyy"):把筛选用的字符串也转成同格式的日期,确保两边都是日期类型再比较。
执行后会正确筛选出01/01/2022这条记录(因为它确实比2021年12月30日晚)。如果要筛选早于该日期的记录,把>换成<即可。
内容的提问来源于stack exchange,提问作者lunbox
相关产品推荐
相关产品推荐

