如何在AWS中通过指定数据库使用Glue作业覆盖S3路径的parquet文件
基于AWS Glue实现指定数据库的Parquet文件写入覆盖操作方案
你提供的是Glue作业写入S3并同步更新Glue Catalog的默认追加代码,按照覆盖范围不同,修改方案如下:
场景1:全量覆盖整张表的所有数据及分区
适合整表重刷的场景,核心修改getSink的updateBehavior参数即可:
DataSink0 = glueContext.getSink( path = "s3://mybucket/", connection_type = "s3", # 核心修改:将默认的LOG改为OVERWRITE实现覆盖 updateBehavior = "OVERWRITE", partitionKeys = ["codigo"], enableUpdateCatalog = True, transformation_ctx = "DataSink0" ) # 保持指定的目标数据库、表名不变,会自动同步覆盖后的元数据 DataSink0.setCatalogInfo(catalogDatabase = "database-gold",catalogTableName = "address") DataSink0.setFormat("glueparquet") DataSink0.writeFrame(Transform0) job.commit()
该配置会先删除目标S3路径下所有现有Parquet文件,再写入新数据,同时自动更新database-gold库下address表的元数据。
场景2:仅覆盖本次写入涉及的分区,保留其余分区数据
适合增量重刷指定分区的场景,不需要改动整张表,新增partitionOverwriteMode参数即可:
DataSink0 = glueContext.getSink( path = "s3://mybucket/", connection_type = "s3", updateBehavior = "OVERWRITE", partitionKeys = ["codigo"], # 新增参数:动态分区覆盖,仅覆盖本次数据中出现的codigo分区,其余分区保留 partitionOverwriteMode = "dynamic", enableUpdateCatalog = True, transformation_ctx = "DataSink0" ) DataSink0.setCatalogInfo(catalogDatabase = "database-gold",catalogTableName = "address") DataSink0.setFormat("glueparquet") DataSink0.writeFrame(Transform0) job.commit()
注意事项
- 覆盖操作会直接删除目标路径/目标分区的原有数据,执行前建议先对原有数据做备份验证
- 如果你的Glue版本低于2.0,动态分区覆盖参数可能不生效,需要先升级Glue版本到3.0及以上
- 若不需要同步更新Glue数据目录,把
enableUpdateCatalog改为False即可
内容的提问来源于stack exchange,提问作者Paulo
相关产品推荐
相关产品推荐

