如何在PySpark中使用date_sub筛选指定日期前7天的数据?
问题排查与解决
原代码的核心错误
- 类型不匹配:
date_string是字符串类型,直接和date_sub生成的日期对象比较,Spark无法正确解析逻辑 - 给定日期定义错误:把每行的
date_string当成目标日期,而非固定的'2023-09-15' - 日期范围计算偏差:
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
相关产品推荐
相关产品推荐

