如何在PySpark空DataFrame中自动生成并填充日期列
在PySpark中生成指定范围的日期序列DataFrame
方法1:使用sequence函数(PySpark 2.4+推荐)
利用PySpark内置的sequence函数生成连续日期序列,再通过explode展开为单行日期记录。
from pyspark.sql import SparkSession from pyspark.sql.functions import explode, sequence, to_date, lit, date_format # 初始化SparkSession spark = SparkSession.builder.appName("DateRangeGenerator").getOrCreate() # 定义目标日期范围 start_date = "1900-01-01" end_date = "2030-12-31" # 生成Date类型的日期列(默认显示格式为yyyy-mm-dd) date_df = spark.createDataFrame([(start_date, end_date)], ["start", "end"]) \ .withColumn( "date_col", explode(sequence(to_date(lit(start_date)), to_date(lit(end_date)), lit("1 day"))) ) \ .select("date_col") # 若需要字符串格式的日期列,可添加转换逻辑 date_df = date_df.withColumn("date_str", date_format("date_col", "yyyy-MM-dd")) # 查看前5条结果 date_df.show(5)
也可以直接通过Spark SQL语句快速实现:
SELECT explode(sequence(to_date('1900-01-01'), to_date('2030-12-31'), interval 1 day)) AS date_col
方法2:兼容旧版本PySpark(低于2.4)
如果你的Spark版本不支持sequence函数,可通过生成数字序列再转换为日期:
from pyspark.sql import SparkSession from pyspark.sql.functions import expr spark = SparkSession.builder.appName("DateRangeGenerator").getOrCreate() start_date = "1900-01-01" end_date = "2030-12-31" # 计算起始到结束日期的总天数差 days_diff = spark.sql(f"SELECT datediff(to_date('{end_date}'), to_date('{start_date}')) AS diff").collect()[0]["diff"] # 生成数字序列并转换为对应日期 date_df = spark.range(0, days_diff + 1) \ .withColumn("date_col", expr(f"date_add(to_date('{start_date}'), id)")) \ .select("date_col")
注意事项
date_col为DateType类型,Spark默认以yyyy-MM-dd格式显示;若需固定字符串格式,使用date_format函数转换即可。- 部分旧版本Spark对1900年这类早期日期的处理可能存在兼容性问题,建议测试边界日期(如1900-01-01、2030-12-31)的正确性。
内容的提问来源于stack exchange,提问作者Jamie Arodi
相关产品推荐
相关产品推荐

