簡體   English   中英

AWS Glue 和更新重復數據

[英]AWS Glue and update duplicating data

我正在使用 AWS Glue 將多個文件從 S3 移動到 RDS 實例。 每天我都會在 S3 中獲取一個新文件,該文件可能包含新數據,但也可能包含我已經保存的帶有一些更新值的記錄。 如果我多次運行該作業,我當然會在數據庫中獲得重復的記錄。 如果 Glue 注意到某個字段已更改,我希望 Glue 嘗試更新該記錄,而不是插入多個記錄,每個記錄都有一個唯一的 ID。 這可能嗎?

我遵循了 Yuriy 建議作為第二個選項的類似方法。 獲取現有數據以及新數據,然后進行一些處理以合並它們並以覆蓋模式寫入。 以下代碼將幫助您了解如何解決此問題。

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()

不幸的是,使用 Glue 沒有優雅的方法來做到這一點。 如果您要寫入 Redshift,則可以使用postactions來實現 Redshift 合並操作。 但是,其他 jdbc 接收器是不可能的(afaik)。

或者,在您的 ETL 腳本中,您可以從數據庫加載現有數據以在保存之前過濾掉現有記錄。 但是,如果您的數據庫表很大,那么該作業可能需要一段時間來處理它。

另一種方法是首先使用“覆蓋”模式寫入臨時表(替換現有的臨時數據),然后通過 API 調用數據庫以僅將新記錄復制到最終表中。

我已經使用 INSERT into table .... ON DUPLICATE KEY.. 將 UPSERT 用於運行 mysql 引擎的 Aurora RDS。 也許這將是您的用例的參考。 我們不能使用 JDBC,因為我們目前只支持 APPEND、OVERWRITE、ERROR 模式。

我不確定您使用的 RDS 數據庫引擎,以下是 mysql UPSERTS 的示例。

請參閱此參考資料,我在其中發布了一個使用 INSERT INTO TABLE..ON DUPLICATE KEY for mysql 的解決方案:

使用 INSERT INTO table ON DUPLICATE KEY 時出錯,使用 for 循環數組

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM