PySpark字符串转TimestampType报错,常用方案无效如何解决?
错误根因
报错触发在session.createDataFrame(df.rdd, schema=events_schema)这一行:你从S3读取CSV得到的原始DataFrame中,dt字段为字符串类型,此时你直接强制应用要求dt为TimestampType的Schema,类型不匹配直接抛出错误,后续的withColumn转换逻辑根本没有执行。
修复方案
方案1:读取CSV时直接指定时间格式完成自动转换
直接在CSV读取阶段传入Schema和时间格式规则,Spark会自动完成字符串到Timestamp的转换,无需后续额外处理:
from pyspark.sql.types import * from awsglue.context import GlueContext from pyspark.context import SparkContext glueContext = GlueContext(SparkContext.getOrCreate()) spark = glueContext.spark_session events_schema = StructType([ StructField("dt", TimestampType(), nullable=False), # 其余字段定义保持不变 ]) df = spark.read.csv( path="s3://bucket/to/raw.csv", header=True, schema=events_schema, timestampFormat="yyyy-MM-dd'T'HH:mm:ss" ) df.show(1, False)
方案2:调整现有代码的执行顺序
如果要保留Glue DynamicFrame的读取逻辑,先完成dt字段的类型转换,再应用Schema校验:
from pyspark.sql.functions import to_timestamp, col from pyspark.sql.types import * from awsglue.context import GlueContext from pyspark.context import SparkContext # 读取原始CSV,此时dt为字符串类型 df = GlueContext(SparkContext.getOrCreate()).create_dynamic_frame.from_options( connection_type="s3", connection_options={ 'paths': ["s3://bucket/to/raw.csv"] }, format="csv", format_options={'withHeader': True} ).toDF() # 先转换dt为Timestamp类型 df = df.withColumn("dt", to_timestamp("dt", "yyyy-MM-dd'T'HH:mm:ss")) # 可选:过滤格式不符合要求的脏数据 df = df.filter(col("dt").isNotNull()) events_schema = StructType([ StructField("dt", TimestampType(), nullable=False), # 其余字段定义保持不变 ]) # 此时dt已经是Timestamp类型,应用Schema不会报错 df = spark.createDataFrame(df.rdd, schema=events_schema) df.show(1, False)
内容的提问来源于stack exchange,提问作者Jérémy
相关产品推荐
相关产品推荐

