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

如何在PySpark中使用date_sub筛选指定日期前7天的数据?

问题排查与解决

原代码的核心错误

  1. 类型不匹配:date_string是字符串类型,直接和date_sub生成的日期对象比较,Spark无法正确解析逻辑
  2. 给定日期定义错误:把每行的date_string当成目标日期,而非固定的'2023-09-15'
  3. 日期范围计算偏差:date_sub(given_date, 8)会把起始日期算成目标日期前8天,导致范围不符合“前7天”的需求

正确实现代码

from pyspark.sql import SparkSession
from pyspark.sql.functions import col, to_date, date_sub

spark = SparkSession.builder.appName("DateFilterExample").getOrCreate()

data = [("2023-09-01",), ("2023-09-02",), ("2023-09-03",), ("2023-09-04",), ("2023-09-05",),
        ("2023-09-06",), ("2023-09-07",), ("2023-09-08",), ("2023-09-09",), ("2023-09-10",),
        ("2023-09-11",), ("2023-09-12",), ("2023-09-13",), ("2023-09-14",), ("2023-09-15",),
        ("2023-09-16",), ("2023-09-17",), ("2023-09-18",), ("2023-09-19",), ("2023-09-20",)]

# 先把字符串日期转成Spark可识别的日期类型
df = spark.createDataFrame(data, ["date_string"]).withColumn("calendar_date", to_date(col("date_string"), "yyyy-MM-dd"))

# 固定目标日期
target_date = "2023-09-15"
# 计算前7天的范围:从目标日期减7天到前一天(共7天)
start_range = date_sub(to_date(target_date), 7)
end_range = date_sub(to_date(target_date), 1)

# 执行筛选
filtered_df = df.filter(
    (col("calendar_date") >= start_range) & 
    (col("calendar_date") <= end_range)
)

filtered_df.select("date_string").show()

运行结果

+-----------+
|date_string|
+-----------+
| 2023-09-08|
| 2023-09-09|
| 2023-09-10|
| 2023-09-11|
| 2023-09-12|
| 2023-09-13|
| 2023-09-14|
+-----------+

可选调整

如果需要包含目标日期(即取目标日期及之前7天,共8天),只需修改end_range:

end_range = to_date(target_date)

内容的提问来源于stack exchange,提问作者Tomás Jullier

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 20:50:00