PySpark定义Schema后读取CSV遇空值,如何转换日期时间字段类型?
问题分析与解决方案
首先你代码里存在一个矛盾点:同时设置了inferSchema=true和自定义.schema(schema),Spark会优先使用自定义Schema,但inferSchema会干扰解析逻辑,这很可能是导致字段出现空值的原因之一,建议直接移除option("inferSchema", "true")。
针对DateType和TimestampType字段的类型转换,分两种常用场景处理:
一、读取CSV时直接指定格式解析(推荐)
CSV中的日期/时间戳本质是字符串,Spark默认解析格式可能和你的数据不匹配,需显式指定格式:
1. 解析日期字段
假设你的bch_date格式为yyyy-MM-dd,添加dateFormat选项:
df_dataframe = ( spark.read .option('header', True) .option("dateFormat", "yyyy-MM-dd") # 匹配CSV中日期字符串的实际格式 .schema(schema) .csv('test.csv') )
2. 解析时间戳字段
假设时间戳格式为yyyy-MM-dd HH:mm:ss.SSS,添加timestampFormat选项:
df_dataframe = ( spark.read .option('header', True) .option("dateFormat", "yyyy-MM-dd") .option("timestampFormat", "yyyy-MM-dd HH:mm:ss.SSS") # 匹配时间戳字符串格式 .schema(schema) .csv('test.csv') )
二、读取后手动转换(适配多格式场景)
如果不同日期/时间戳字段格式不统一,或读取后部分字段因格式不匹配变为空值,可使用Spark内置函数手动转换:
1. 转换日期字段
from pyspark.sql.functions import to_date df_dataframe = df_dataframe.withColumn( "bch_date", to_date(df_dataframe["bch_date"], "yyyy-MM-dd") # 对应CSV中的实际格式 )
2. 转换时间戳字段
from pyspark.sql.functions import to_timestamp # 单个字段转换 df_dataframe = df_dataframe.withColumn( "secr_attoc_stt_ts", to_timestamp(df_dataframe["secr_attoc_stt_ts"], "yyyy-MM-dd HH:mm:ss") ) # 批量转换所有时间戳字段 timestamp_cols = ["secr_attoc_stt_ts", "secr_alloc_end_ts", "crte_tstp", "last_updt_tstp"] for col in timestamp_cols: df_dataframe = df_dataframe.withColumn( col, to_timestamp(df_dataframe[col], "yyyy-MM-dd HH:mm:ss") )
三、空值处理补充
- 转换时如果字符串格式不匹配,结果会返回
null,可使用coalesce兜底处理异常值:
from pyspark.sql.functions import coalesce, lit from pyspark.sql.types import DateType df_dataframe = df_dataframe.withColumn( "bch_date", coalesce(to_date(df_dataframe["bch_date"], "yyyy-MM-dd"), lit(None).cast(DateType())) )
- 若需过滤空值,可使用
df_dataframe.filter(df_dataframe["bch_date"].isNotNull())
内容的提问来源于stack exchange,提问作者Sandilya
相关产品推荐
相关产品推荐

