如何在Spark DataFrame中生成两日期间的每日日期序列(含结束不含开始)
Spark生成指定日期范围的每日日期序列
需求说明
现有如下Spark DataFrame:
+-------------------+-------------------+ | first | last | +-------------------+-------------------+ |2022-11-03 00:00:00|2022-11-06 00:00:00| +-------------------+-------------------+
需要生成从first字段日期(不含)到last字段日期(含)的每日日期序列,最终输出新增array_dates字段存储日期数组。
解决方案
利用Spark内置的sequence函数结合日期运算,直接生成目标日期数组,无需额外展开再聚合,效率更高。
Python 版本
from pyspark.sql import functions as F # 若first/last为字符串类型,先转换为时间戳类型(如果已是日期/时间戳类型可跳过此步) df = df.withColumn("first", F.to_timestamp("first")) \ .withColumn("last", F.to_timestamp("last")) # 生成日期序列数组 result_df = df.withColumn( "array_dates", F.sequence(F.date_add(F.col("first"), 1), F.col("last"), F.expr("interval 1 day")) ) # 查看结果 result_df.show(truncate=False)
Scala 版本
import org.apache.spark.sql.functions._ // 若first/last为字符串类型,先转换为时间戳类型(如果已是日期/时间戳类型可跳过此步) val df = df.withColumn("first", to_timestamp($"first")) .withColumn("last", to_timestamp($"last")) // 生成日期序列数组 val resultDF = df.withColumn( "array_dates", sequence(date_add($"first", 1), $"last", expr("interval 1 day")) ) // 查看结果 resultDF.show(false)
输出结果
+-------------------+-------------------+-----------------------------------------------------------------+ |first |last |array_dates | +-------------------+-------------------+-----------------------------------------------------------------+ |2022-11-03 00:00:00|2022-11-06 00:00:00|[2022-11-04 00:00:00, 2022-11-05 00:00:00, 2022-11-06 00:00:00]| +-------------------+-------------------+-----------------------------------------------------------------+
内容的提问来源于stack exchange,提问作者Alejandro Espada
相关产品推荐
相关产品推荐

