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

在AWS Glue 4.0中使用Delta Lake的saveAsTable报错求助

解决方案

1. 修正Glue作业参数格式

你当前的--conf参数格式有误,在Glue作业的参数配置中,参数名是--conf,对应的值应直接传递Spark配置串,无需额外添加值:前缀。正确的参数配置应为:

  • 参数名:--conf,值:spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension --conf spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog
  • 参数名:--datalake-formats,值:delta

错误格式会导致Spark无法加载Delta相关扩展与Catalog,进而引发路径解析异常。

2. 修复代码中final_df未定义的逻辑漏洞

当表已存在(created_table=True)时,你的代码仅执行print('test'),未对final_df赋值,后续调用final_df.repartition()会触发变量未定义错误,也可能间接导致路径相关异常。修正逻辑如下:

if created_table:
    # 后续可补充合并逻辑,先临时赋值final_df
    final_df = source_df.withColumn('flag', F.lit('NC'))
else:
    # 首次执行所有行标记为插入
    final_df = source_df.withColumn('flag',F.lit('I'))

3. 调整表名格式,移除不必要的反引号

saveAsTable使用的表名无需添加反引号,直接用db_name.final_table格式即可,Glue Catalog可正确识别:

db_tab = f"{db_name}.{final_table}"

4. 验证S3路径与IAM权限

  • 确认S3路径s3://bucket_test_dl_0065/delta_table/真实存在,无拼写错误
  • 确保Glue作业关联的IAM角色拥有该S3路径的s3:PutObject、s3:GetObject等读写权限

5. 确认Delta Catalog配置生效

可在代码中添加验证逻辑,确认Delta Catalog已正确加载:

print(f"当前Spark Catalog: {spark.conf.get('spark.sql.catalog.spark_catalog')}")

若输出为org.apache.spark.sql.delta.catalog.DeltaCatalog,则配置生效。

修正后的关键代码片段

# ... 其他代码 ...

if created_table:
    final_df = source_df.withColumn('flag', F.lit('NC'))
else:
    final_df = source_df.withColumn('flag',F.lit('I'))

db_tab = f"{db_name}.{final_table}"

additional_options = {
    "path": "s3://bucket_test_dl_0065/delta_table/"
}

final_df.repartition(1).write \
    .format("delta") \
    .options(**additional_options) \
    .mode("append") \
    .partitionBy("country") \
    .saveAsTable(db_tab)

job.commit()

内容的提问来源于stack exchange,提问作者bigdataadd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 19:25:32