AWS Glue写入DynamicFrame报错:CDSITRIS列预期double实际为binary
解决方案
核心原因
问题出在Parquet文件实际元数据中包含CDSITRIS列,但Data Catalog的schema未同步该字段。Glue读取时会自动解析Parquet文件的真实schema,即便你没选择该字段,后续写入环节仍可能触发类型校验逻辑,导致报错。
具体解决步骤
1. 读取时显式指定加载字段,直接跳过无关列
不依赖Data Catalog的schema,在create_dynamic_frame.from_catalog中通过additional_options指定columns参数,仅加载需要的字段:
from awsglue.context import GlueContext from pyspark.context import SparkContext sc = SparkContext() glueContext = GlueContext(sc) # 仅列出需要写入的字段,彻底排除CDSITRIS dynamic_frame = glueContext.create_dynamic_frame.from_catalog( database="你的数据库名", table_name="你的表名", additional_options={"columns": "字段1,字段2,字段3"} # 替换为你需要的目标字段 )
这种方式让Glue只读取指定字段,完全忽略Parquet文件中的隐藏列,从根源避免类型校验冲突。
2. 转Spark DataFrame严格筛选后再转回DynamicFrame
如果第一种方法无效,先将DynamicFrame转为Spark DataFrame,筛选目标字段后再转回DynamicFrame,绕开Glue的自动schema解析逻辑:
# 读取原始DynamicFrame df = dynamic_frame.toDF() # 仅保留需要的字段 filtered_df = df.select("字段1", "字段2", "字段3") # 替换为目标字段 # 转回DynamicFrame filtered_dynamic_frame = glueContext.create_dynamic_frame.from_df( filtered_df, glueContext.create_resolve_spec(), "filtered_frame" )
利用Spark DataFrame的严格字段选择,彻底剥离无关列,避免写入时触发隐藏列的类型校验。
3. 手动定义schema,强制忽略Parquet元数据中的额外列
若Parquet文件存在大量额外列,可手动编写目标schema,让Glue按指定schema读取,忽略文件中未定义的列:
from pyspark.sql.types import StructType, StructField, StringType, DoubleType from awsglue.context import GlueContext from pyspark.context import SparkContext sc = SparkContext() glueContext = GlueContext(sc) spark = glueContext.spark_session # 手动定义仅包含目标字段的schema custom_schema = StructType([ StructField("字段1", StringType(), nullable=True), StructField("字段2", DoubleType(), nullable=True), # 添加你需要的其他字段 ]) # 用自定义schema直接读取Parquet文件 df = spark.read.schema(custom_schema).parquet("s3://你的Parquet文件路径/") filtered_dynamic_frame = glueContext.create_dynamic_frame.from_df( df, glueContext.create_resolve_spec(), "custom_schema_frame" )
通过Spark原生读取方式指定schema,Glue不会加载schema外的任何列,彻底规避隐藏列的类型问题。
注意事项
resolveChoice和selectExpr无法解决此问题,因为这些操作基于已加载的schema执行,隐藏列已被Glue读入内存,无法彻底排除。- 确保指定的字段列表或自定义schema与目标写入字段完全匹配,避免遗漏或字段类型错误。
内容的提问来源于stack exchange,提问作者Rodrigo Takeuti
相关产品推荐
相关产品推荐

