AWS Glue Spark Job因分区列与数据列重复(day/month/year)报错求助
解决Glue Spark Job读取数据时的重复分区列问题
问题说明
报错信息:
AnalysisException:数据模式与分区模式中存在重复列day、month、year核心场景:
- S3存储的Parquet数据文件本身包含
year、month、day列- Glue Catalog中对应表的分区列也是
year、month、day- 使用
glueContext.create_dynamic_frame.from_catalog读取并添加分区过滤后,尝试用drop_fields删除重复列无效
代码片段:
dyf= glueContext.create_dynamic_frame.from_catalog(database = db,table_name = tbl, additional_options={"catalogPartitionPredicate":"year>=2022 and month>=10 and day>=1"},transformation_ctx="dyf") dyfdrop = dyf.drop_fields(paths=["year", "month", "day"]) dyfdrop.toDF().printSchema() dyfdrop.toDF().show()
S3路径示例:s3://bucket/f1/f2/tbl/year=2022/month=10/day=1/
可行解决方案
1. 读取阶段指定加载列(规避重复)
直接在读取时指定需要加载的列,排除year、month、day,避免和分区列冲突:
dyf = glueContext.create_dynamic_frame.from_catalog( database=db, table_name=tbl, additional_options={ "catalogPartitionPredicate": "year>=2022 and month>=10 and day>=1", "columnsToRead": ["col1", "col2", "col3"] # 替换成你实际需要的列,不要包含year/month/day }, transformation_ctx="dyf" )
2. 修复表结构(根治方案)
既然分区列已经通过路径存储,没必要在Parquet文件里重复保存这三个列:
- 重新生成Parquet数据,移除文件内的
year、month、day列 - 更新Glue Catalog表的schema,删除这三个列,确保表结构和分区列无重复
3. 改用Spark原生DataFrame API
如果Dynamic Frame的drop_fields不生效,直接用Spark DataFrame操作:
# 从Glue Catalog读取表并应用分区过滤 df = spark.read.table(f"{db}.{tbl}").filter("year>=2022 and month>=10 and day>=1") # 删除重复列 df_clean = df.drop("year", "month", "day") df_clean.printSchema() df_clean.show()
4. 临时禁用分区自动加载(不推荐)
通过参数关闭分区列自动加载,改用pushDownPredicate做过滤,但会丢失分区读取的性能优化,仅作临时应急:
dyf = glueContext.create_dynamic_frame.from_catalog( database=db, table_name=tbl, additional_options={ "disablePartitioning": "true", "pushDownPredicate": "year>=2022 and month>=10 and day>=1" }, transformation_ctx="dyf" )
内容的提问来源于stack exchange,提问作者Raaj
相关产品推荐
相关产品推荐

