PySpark:将日期时间转为Date/Timestamp类型并保留原格式
问题解决:PySpark中保持Date/Timestamp类型同时按指定格式展示/输出
核心说明
Parquet是列式二进制存储格式,Date和Timestamp类型存储的是底层数值(Date存从基准日起的天数、Timestamp存微秒级时间戳),并非字符串格式。你看到的YYYY-MM-DD或YYYY-MM-DDTHH:MM:SS只是Spark、Pandas等工具默认的显示格式,不是Parquet文件内的存储格式。要保持原生类型的同时得到指定格式的输出,需要在读取或导出阶段做格式化处理。
解决方案代码
1. 原CSV转Parquet的代码(保留原生类型)
先确保正确将CSV中的字符串转成Date/Timestamp类型(注意你的Date字段是mm/dd/yy格式,修正格式串匹配):
from pyspark.sql.functions import to_date, to_timestamp # 假设data是读取后的CSV DataFrame for col_name, col_type in data.dtypes: if col_name == 'Date': data = data.withColumn(col_name, to_date(data[col_name], 'MM/dd/yy')) elif col_name == 'Timestamp': data = data.withColumn(col_name, to_timestamp(data[col_name], 'yyyy-MM-dd-HH.mm.ss.SSSSSS')) # 写入Parquet,此时存储的是原生Date/Timestamp类型 data.write.parquet("path/to/output.parquet")
2. 读取Parquet时按指定格式展示/导出
如果需要按MM/dd/yyyy和yyyy-MM-dd-HH.mm.ss.SSSSSS格式输出,可在读取后用date_format函数转换为字符串格式(原生类型列可保留):
from pyspark.sql.functions import date_format # 读取Parquet文件 df = spark.read.parquet("path/to/output.parquet") # 方式1:添加格式化后的字符串列,保留原生类型列 df_formatted = df.withColumn("Formatted_Date", date_format(df["Date"], "MM/dd/yyyy")) \ .withColumn("Formatted_Timestamp", date_format(df["Timestamp"], "yyyy-MM-dd-HH.mm.ss.SSSSSS")) # 查看结果 df_formatted.show() # 方式2:直接查询格式化后的结果,不修改原DataFrame df.select( date_format("Date", "MM/dd/yyyy").alias("Date"), date_format("Timestamp", "yyyy-MM-dd-HH.mm.ss.SSSSSS").alias("Timestamp") ).show() # 方式3:导出为CSV等格式时使用指定格式 df.select( date_format("Date", "MM/dd/yyyy").alias("Date"), date_format("Timestamp", "yyyy-MM-dd-HH.mm.ss.SSSSSS").alias("Timestamp") ).write.csv("path/to/formatted_output.csv", header=True)
关键提醒
- 不要试图修改Parquet中Date/Timestamp类型的存储格式,因为原生类型没有格式属性,格式仅存在于字符串转换阶段。
- 若必须在某个环节展示指定格式,始终通过
date_format将原生类型转换为字符串列来实现,原生类型列可保留用于后续的日期时间计算。
内容的提问来源于stack exchange,提问作者newbie
相关产品推荐
相关产品推荐

