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

PySpark创建含日期范围的DataFrame报错,求解决方法

解决PySpark创建日期范围DataFrame报错问题

错误原因

spark.range() 仅接受整数类型的起始/结束参数,你直接传入字符串格式的日期,必然触发类型不匹配错误。将日期转整数的思路是对的,但需要转成日期对应的epoch天数偏移量(即从1970-01-01到目标日期的天数),而非随意转换。

方法一:基于天数偏移量生成日期范围

先把字符串日期转成epoch天数,用spark.range生成整数序列,再转回日期:

from pyspark.sql import SparkSession
from pyspark.sql.functions import expr

spark = SparkSession.builder.appName('pyspark-shellTest2').getOrCreate()

start_date = "2022-08-20"
end_date = "2022-10-03"

# 计算起始/结束日期对应的epoch天数(从1970-01-01开始的天数)
start_day = spark.sql(f"select to_date('{start_date}') - to_date('1970-01-01') as day").collect()[0]['day']
end_day = spark.sql(f"select to_date('{end_date}') - to_date('1970-01-01') as day").collect()[0]['day']

# 生成日期范围(+1是因为range左闭右开,确保包含end_date)
date_range_df = spark.range(start_day, end_day + 1) \
                     .withColumn("date", expr("date_add('1970-01-01', id)")) \
                     .drop("id")

date_range_df.show()

方法二:用sequence函数直接生成(Spark 2.4+)

Spark 2.4及以上版本支持sequence函数,可直接生成日期序列,无需手动转整数,更简洁:

from pyspark.sql import SparkSession
from pyspark.sql.functions import explode, to_date

spark = SparkSession.builder.appName('pyspark-shellTest2').getOrCreate()

start_date = "2022-08-20"
end_date = "2022-10-03"

# 生成日期序列并展开为单行记录
date_range_df = spark.sql(f"""
    select explode(sequence(to_date('{start_date}'), to_date('{end_date}'), interval 1 day)) as date
""")

date_range_df.show()

内容的提问来源于stack exchange,提问作者Aztec619

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 15:20:49