我正在使用AWS Glue将多个文件从S3移动到RDS实例。每天我都会在S3中得到一个新文件,其中可能包含新数据,但也可能包含我已经保存的带有一些更新值的记录。如果我多次运行该作业,我当然会在数据库中得到重复的记录。如果要注意的是字段已更改,我希望Glue尝试插入并更新多个记录,而不是插入多个记录,而是每个记录都有一个唯一的ID。这可能吗?
答案 0 :(得分:2)
不幸的是,使用胶水没有优雅的方法。如果要写给Redshift,可以进行use postactions
to implement Redshift merge操作。但是,其他jdbc接收器(afaik)则不可能。
或者,在ETL脚本中,您可以从数据库加载现有数据以在保存之前过滤掉现有记录。但是,如果您的数据库表很大,则该工作可能需要一段时间才能处理。
另一种方法是先以“覆盖”模式写入替换表(替换现有的替换数据),然后通过API调用数据库以仅将新记录复制到最终表中。
答案 1 :(得分:1)
我遵循了类似的方法,这是尤里(Yuriy)建议的第二种选择。获取现有数据以及新数据,然后进行一些处理以合并到其中,并以ovewrite模式进行写入。以下代码将帮助您了解如何解决此问题。
sc = SparkContext()
glueContext = GlueContext(sc)
#get your source data
src_data = create_dynamic_frame.from_catalog(database = src_db, table_name = src_tbl)
src_df = src_data.toDF()
#get your destination data
dst_data = create_dynamic_frame.from_catalog(database = dst_db, table_name = dst_tbl)
dst_df = dst_data.toDF()
#Now merge two data frames to remove duplicates
merged_df = dst_df.union(src_df)
#Finally save data to destination with OVERWRITE mode
merged_df.write.format('jdbc').options( url = dest_jdbc_url,
user = dest_user_name,
password = dest_password,
dbtable = dest_tbl ).mode("overwrite").save()
答案 2 :(得分:0)
我已将INSERT插入表.... ON DUPLICATE KEY ..中,用于将UPSERT插入运行mysql引擎的Aurora RDS中。也许这将是您的用例的参考。我们目前仅支持APPEND,OVERWRITE,ERROR模式,因此无法使用JDBC。
我不确定您使用的RDS数据库引擎,下面是mysql UPSERTS的示例。
请参阅此参考资料,我在其中发布了使用INSERT INTO TABLE..ON DUPLICATE KEY for mysql的解决方案:
Error while using INSERT INTO table ON DUPLICATE KEY, using a for loop array