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

PySpark DataFrame保存为CSV后timestamp列格式变化问题求解

问题原因

  • 参数配置错误:你两次执行的写入操作是独立的,每次仅配置了单个时间格式参数,没有同时传入dateFormat和timestampFormat,两个参数未同时生效导致格式规则不生效。
  • Spark版本兼容问题:Spark 3.0及以上版本调整了默认的时间解析、序列化规则,默认时间解析策略更严格,若格式校验不通过会自动fallback到ISO 8601标准格式输出。
  • 时区不匹配:timestamp类型底层存储的是UTC时间戳,若Spark会话时区和数据实际对应的时区不一致,输出时会自动做时区转换,同时改变输出格式。

解决方法

方案1:统一配置参数写入

写入CSV时同时传入两个时间格式参数,同时提前配置Spark会话的时区和时间解析策略适配格式要求,代码示例如下:

from pyspark.sql import SparkSession

# 初始化Spark时配置时区和时间解析策略,适配3.x版本规则
spark = SparkSession.builder \
    .config("spark.sql.session.timeZone", "Asia/Shanghai") \ # 替换为你实际使用的时区
    .config("spark.sql.legacy.timeParserPolicy", "LEGACY") \
    .getOrCreate()

# 读取Parquet文件
q = spark.read.parquet("/eureka/dhs_aco_ovrvw_000.parquet")

# 写入时同时指定两个格式参数
q.coalesce(1).write.format("csv") \
    .mode("overwrite") \
    .option("header", "true") \ # 按需配置是否输出表头
    .option("dateFormat", "yyyy-MM-dd HH:mm:ss") \
    .option("timestampFormat", "yyyy-MM-dd HH:mm:ss") \
    .save("/test_dhs/")

方案2:手动转换时间格式(兼容性最优)

直接将timestamp列显式转换为指定格式的字符串列,完全规避Spark参数、版本带来的影响,代码示例如下:

from pyspark.sql.functions import date_format
from pyspark.sql import SparkSession

spark = SparkSession.builder.getOrCreate()
q = spark.read.parquet("/eureka/dhs_aco_ovrvw_000.parquet")

# 替换为你实际的timestamp列名,显式转成目标格式字符串
q = q.withColumn("your_timestamp_col", date_format("your_timestamp_col", "yyyy-MM-dd HH:mm:ss"))

# 直接写入即可,无需额外配置时间格式参数
q.coalesce(1).write.format("csv") \
    .mode("overwrite") \
    .option("header", "true") \
    .save("/test_dhs/")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:27:05