未执行 Aurora 目标的 AWS Glue Pre 和 Post 操作

Posted

技术标签:

【中文标题】未执行 Aurora 目标的 AWS Glue Pre 和 Post 操作【英文标题】:AWS Glue Pre and Post actions for Aurora target not getting executed 【发布时间】:2019-12-28 19:30:07 【问题描述】:

我正在尝试定期将一些数据从 Athena 表复制到 Aurora 数据库。我可以弄清楚如何设置 JDBC 连接、爬虫并创建一个能够成功地将所有数据从 Athena 复制到 Aurora 数据库的作业。但是,多次运行同一个作业会导致重复。我已经使用 Job Bookmarks 部分解决了它,但如果 Athena 表数据更改为少数记录,则 S3 文件时间戳会更改并且 Glue 认为它是新数据并将数据重新插入到极光表中。

我发现一篇文章展示了如何在运行 Glue 作业时运行前置和后置操作。 How do I execute SQL commands on an Amazon Redshift table before or after writing data in an AWS Glue job?。我试图通过在阶段表中插入数据并随后将数据插入目标表来做同样的事情。这是应该执行 upsert 的胶水脚本的最后一部分。

pre_query="drop table if exists stage;create table stage as select * from target where 1=2;"
post_query="begin;DELETE FROM target WHERE EXISTS(SELECT 1 FROM stage WHERE stage.id = target.id); insert into target select * from stage; drop table stage; commit;"
datasink4 = glueContext.write_dynamic_frame.from_jdbc_conf(
    frame = dropnullfields3, 
    catalog_connection = "connection", 
    connection_options = 
        "preactions":pre_query,
        "postactions":post_query,
        "dbtable": "stage", 
        "database": "prod_db"
    ,
    transformation_ctx = "datasink4"
)
job.commit()

我可以看到正在创建阶段表并且数据复制得很好,但是 preactions 和 postactions 中的查询没有发生。谁能告诉我发生了什么以及如何实现这一目标?我能想到的一种方法是创建一个 lambda,它可以执行这些在作业执行之前和之后触发的前后查询。有没有办法在胶水内部完成它?

【问题讨论】:

【参考方案1】:

根据您共享的链接,preactions 和 postactions 仅适用于 redshift 而不适用于任何其他数据库。

如果你想实现这个功能,请参考这个post。

【讨论】:

以上是关于未执行 Aurora 目标的 AWS Glue Pre 和 Post 操作的主要内容,如果未能解决你的问题,请参考以下文章

在 AWS Glue-ETL 中向目标表添加新列

AWS Glue - 在插入之前截断目标 postgres 表

将 Aurora 数据迁移到 Redshift DWH 的好方法是啥?

如何使用 AWS Glue 运行任意/DDL SQL 语句或存储过程

SMTP:邮件未通过 AWS Glue Python 作业发送

AWS Glue - boto3 爬虫未创建表