PySpark中判断日期区间内是否存在指定列表中的周日
PySpark 判断日期区间内是否包含指定周日的解决方案
前置说明
假设你的DataFrame中start_date和end_date为字符串类型,需先转换为PySpark的Date类型;预定义的周日列表也需统一为日期格式进行判断。
步骤1:初始化环境与数据处理
from pyspark.sql import SparkSession from pyspark.sql.functions import col, expr, lit from pyspark.sql.types import DateType # 初始化SparkSession spark = SparkSession.builder.appName("CheckHolidaySundays").getOrCreate() # 预定义周日列表 holiday_Sundays_list = ['01/01/2023', '07/04/2027', '07/04/2032'] # 示例DataFrame(替换为你的实际数据) data = [ ("05/01/2023", "05/02/2023"), ("04/26/2023", "05/09/2023"), ("12/28/2022", "01/02/2023") ] df = spark.createDataFrame(data, ["start_date", "end_date"]) # 将字符串日期列转为Date类型 df = df.withColumn("start_date", col("start_date").cast(DateType())) \ .withColumn("end_date", col("end_date").cast(DateType()))
步骤2:生成判断结果列
提供两种实现方式,可根据你的日期列表长度选择:
方式一:适合短列表的直接判断
通过OR连接每个日期的区间校验条件:
# 构建判断条件字符串 condition = " OR ".join([f"(to_date('{d}', 'MM/dd/yyyy') BETWEEN start_date AND end_date)" for d in holiday_Sundays_list]) # 添加结果列 result_df = df.withColumn("Sunday_in_list", expr(f"CASE WHEN {condition} THEN 'Y' ELSE 'N' END")) # 查看结果 result_df.show()
方式二:适合长列表的数组遍历判断
利用exists函数遍历日期数组,判断是否有日期落在目标区间:
# 将预定义日期转为字符串数组(适配PySpark的数组操作) holiday_dates_str = [str(spark.sql(f"to_date('{d}', 'MM/dd/yyyy')").first()[0]) for d in holiday_Sundays_list] # 使用exists函数实现区间判断 result_df = df.withColumn( "Sunday_in_list", expr(f""" CASE WHEN exists(array({','.join([f"'{d}'" for d in holiday_dates_str])}), date -> to_date(date) BETWEEN start_date AND end_date) THEN 'Y' ELSE 'N' END """) ) # 查看结果 result_df.show()
最终输出
两种方式都会得到如下结果:
+----------+----------+---------------+ |start_date| end_date|Sunday_in_list| +----------+----------+---------------+ |2023-05-01|2023-05-02| N| |2023-04-26|2023-05-09| N| |2022-12-28|2023-01-02| Y| +----------+----------+---------------+
内容的提问来源于stack exchange,提问作者XB Day
相关产品推荐
相关产品推荐

