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

