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
相关产品推荐
相关产品推荐

