You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spark中日期字符串比较不符合预期问题排查

正确实现Spark日期字符串筛选的方法

问题根源

  1. 直接字符串比较的问题:你直接用字符串"30/12/2021"和col("date")比较,本质是按字典序对比,不是日期逻辑。比如"30"开头的字符串比"01"开头的大,所以01/01/2022会被错误保留。
  2. 日期转换的错误:你用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 08:10:21