[英]Getting duplicates in the Table when an ETL job Is ruined twice.ETL job fetch data from RDS to S3 bucket
當運行ETL作業時,它會正確執行,但由於表沒有時間戳,因此在運行同一ETL作業時它將復制數據。如何使用Upsert執行暫存和解決此問題,或者歡迎其他任何人回答。我是否擺脫了這個問題,找到的解決方案是在其中添加時間戳或進行分段,還是有其他方法?
在將數據寫入s3時,U可以使用overwrite
。 它將替換原始數據
為了防止在s3上重復,需要在保存之前從目標加載數據並過濾掉現有記錄:
val deltaDf = newDataDf.alias("new")
.join(existingDf.alias("existing"), "id", "left_outer")
.where(col("existing.id").isNull)
.select("new.*")
glueContext.getSinkWithFormat(
connectionType = "s3",
options = JsonOptions(Map(
"path" -> path
)),
transformationContext = "save_to_s3"
format = "avro"
).writeDynamicFrame(DynamicFrame(deltaDf, glueContext))
但是,此方法不會覆蓋更新的記錄。
另一個選擇是也使用一些updated_at
字段保存更新的記錄,下游使用者可以使用該字段獲取最新值。
您還可以考慮在每次運行作業時將數據集轉儲到單獨的文件夾中(即每天在data/dataset_date=<year-month-day>
有完整的數據轉儲)
import org.apache.spark.sql.functions._
val datedDf = sourceDf.withColumn("dataset_date", current_date())
glueContext.getSinkWithFormat(
connectionType = "s3",
options = JsonOptions(Map(
"path" -> path,
"partitionKeys" -> Array("dataset_date")
)),
transformationContext = "save_to_s3"
format = "avro"
).writeDynamicFrame(DynamicFrame(datedDf, glueContext))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.