PySpark读取特殊格式日期/时间戳CSV时如何定义Schema?
PySpark读取自定义格式日期/时间戳的Schema问题
结论
直接在StructType里用DateType()和TimestampType()声明字段类型会出现解析异常或生成null值,因为PySpark默认的日期解析格式是yyyy-MM-dd,时间戳默认格式是yyyy-MM-dd HH:mm:ss,和你文件中的yyyyMMdd、yyyyMMddHHmmss不匹配,无法自动识别转换。
正确处理方式
有两种可靠的解决方法:
1. 先按字符串读取,再手动转换类型
这种方法灵活性最高,适合不同字段有不同日期/时间格式的场景:
from pyspark.sql import SparkSession from pyspark.sql.types import StructType, StructField, StringType from pyspark.sql.functions import to_date, to_timestamp # 初始化SparkSession spark = SparkSession.builder.appName("CustomDateParsing").getOrCreate() # 先以字符串类型定义Schema csv_schema = StructType([ StructField("custom_date", StringType(), nullable=True), StructField("custom_timestamp", StringType(), nullable=True), # 其他字段根据实际情况添加 ]) # 读取CSV文件 raw_df = spark.read.csv("target_file.csv", schema=csv_schema, header=True) # 转换为目标数据类型,指定自定义格式 parsed_df = raw_df.withColumn("custom_date", to_date(raw_df["custom_date"], "yyyyMMdd")) \ .withColumn("custom_timestamp", to_timestamp(raw_df["custom_timestamp"], "yyyyMMddHHmmss")) # 验证结果 parsed_df.printSchema() parsed_df.show()
2. 全局指定日期/时间戳格式(适用于统一格式场景)
如果CSV中所有日期字段都是yyyyMMdd格式、所有时间戳字段都是yyyyMMddHHmmss格式,可以通过读取选项直接指定格式,这样就能直接在Schema中使用DateType()和TimestampType():
from pyspark.sql import SparkSession from pyspark.sql.types import StructType, StructField, DateType, TimestampType spark = SparkSession.builder.appName("GlobalDateFormat").getOrCreate() # 直接用目标类型定义Schema csv_schema = StructType([ StructField("custom_date", DateType(), nullable=True), StructField("custom_timestamp", TimestampType(), nullable=True), # 其他字段... ]) # 读取时指定对应格式(Spark 2.2+支持) parsed_df = spark.read.csv("target_file.csv", schema=csv_schema, header=True, dateFormat="yyyyMMdd", timestampFormat="yyyyMMddHHmmss")
注意事项
- 全局格式配置仅对所有同类型字段生效,如果存在多种格式的日期/时间字段,优先使用第一种方法。
- 若未指定格式直接用
DateType()/TimestampType(),PySpark会尝试用默认格式解析,失败后字段值会变为null,部分场景下会抛出解析错误。
内容的提问来源于stack exchange,提问作者Duccio Borchi
相关产品推荐
相关产品推荐

