AWS Glue和更新重复数据

时间:2018-11-22 19:21:11

标签: python pyspark etl aws-glue

我正在使用AWS Glue将多个文件从S3移动到RDS实例。每天我都会在S3中得到一个新文件,其中可能包含新数据,但也可能包含我已经保存的带有一些更新值的记录。如果我多次运行该作业,我当然会在数据库中得到重复的记录。如果要注意的是字段已更改,我希望Glue尝试插入并更新多个记录,而不是插入多个记录,而是每个记录都有一个唯一的ID。这可能吗?

3 个答案:

答案 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