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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 12:48:05