簡體   English   中英

當ETL作業被破壞兩次時,在表中獲取重復.ETL作業將數據從RDS提取到S3存儲桶

[英]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.

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