如何在PySpark中获取dd-MM-yyyy格式的Date类型数据?
PySpark 日期处理:Date类型+dd-MM-yyyy显示格式解决方案
问题核心
PySpark的Date类型本身是无格式的日期存储对象,show()方法默认用yyyy-MM-dd格式展示,但这并不影响其数据类型。你遇到的问题本质是混淆了「日期存储类型」和「日期显示格式」。
步骤1:确认字符串已成功转为Date类型
你的代码其实已经正确将dd-MM-yyyy格式的字符串转为Date类型,只是默认展示格式不是你想要的。可以通过printSchema()验证类型:
from pyspark.sql.functions import to_date import pyspark.sql.functions as F df = spark.createDataFrame([("12-06-2023",)], ["input_date"]) df = df.withColumn("output_date", F.to_date(df.input_date, "dd-MM-yyyy")) # 查看数据类型 df.printSchema() # 输出: # root # |-- input_date: string (nullable = true) # |-- output_date: date (nullable = true)
此时output_date确实是Date类型,show()的默认展示格式只是PySpark的显示规则,不影响实际存储类型。
步骤2:实现「Date类型+dd-MM-yyyy显示/输出」
如果需要在展示或输出时用dd-MM-yyyy格式,同时保留Date类型,有两种方案:
方案1:临时格式化展示(不改变存储类型)
用date_format函数生成一个格式化后的字符串列,同时保留原Date列:
df = df.withColumn("formatted_date", F.date_format(df.output_date, "dd-MM-yyyy")) df.show() # 输出: # +----------+-----------+--------------+ # |input_date|output_date|formatted_date| # +----------+-----------+--------------+ # |12-06-2023| 2023-06-12| 12-06-2023| # +----------+-----------+--------------+ # 查看类型:output_date仍是Date,formatted_date是String df.printSchema()
方案2:全局修改日期展示格式(影响所有Date列的show输出)
如果想让所有Date列在show()时都用dd-MM-yyyy格式,可以修改Spark配置:
# 设置全局日期展示格式 spark.conf.set("spark.sql.dateFormat", "dd-MM-yyyy") # 重新执行转换并展示 df = spark.createDataFrame([("12-06-2023",)], ["input_date"]) df = df.withColumn("output_date", F.to_date(df.input_date, "dd-MM-yyyy")) df.show() # 输出: # +----------+-----------+ # |input_date|output_date| # +----------+-----------+ # |12-06-2023| 12-06-2023| # +----------+-----------+ # 类型仍为Date df.printSchema()
注意:这个配置仅影响show()的显示格式,不会改变Date类型的存储本质。
常见误区澄清
- 用
to_date转换后得到的Date类型,无论展示格式如何,都是正确的日期对象,可直接用于日期计算(如加减天数、比较等)。 - 如果直接用
date_format转换字符串,得到的是String类型,无法参与日期运算,这也是你之前出现「格式正确但类型为String」的原因。
内容的提问来源于stack exchange,提问作者joo
相关产品推荐
相关产品推荐

