在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
相关产品推荐
相关产品推荐

