簡體   English   中英

從 azure 數據塊中的多任務作業寫入分區增量表時出錯

[英]Error writing a partitioned Delta Table from a multitasking job in azure databricks

我有一個筆記本,上面寫了一個增量表,其中包含類似於以下的語句:

match = "current.country = updates.country and current.process_date = updates.process_date"
deltaTable = DeltaTable.forPath(spark, silver_path)
deltaTable.alias("current")\
.merge(
    data.alias("updates"),
    match) \
  .whenMatchedUpdate(
      set = update_set,
      condition = condition) \
  .whenNotMatchedInsert(values = values_set)\
  .execute()

多任務作業有兩個並行執行的任務。 在此處輸入圖像描述

執行作業時顯示以下錯誤:

ConcurrentAppendException:文件已通過並發更新添加到分區 [country=Panamá,process_date=2022-01-01 00:00:00]。 請重試該操作。

在每個任務中,我發送不同的國家(巴拿馬、厄瓜多爾)和相同的日期作為參數,因此在執行時只應寫入與發送的國家相對應的信息。 此增量表按 country 和 process_date 字段分區。 知道我做錯了什么嗎? 使用“merge”語句時應該如何指定受影響的分區?

如果您能闡明在這些情況下我應該如何使用分區,我將不勝感激,因為這對我來說是新的。

更新:我根據 此處指示的內容對條件進行了調整以指定國家和流程日期 (ConcurrentAppendException) 現在我收到以下錯誤消息:

ConcurrentAppendException:文件已通過並發更新添加到表的根目錄中。 請重試該操作。

我想不出是什么導致了錯誤。 繼續調查。

錯誤 – ConcurrentAppendException:文件已通過並發更新添加到表的根目錄中。 請重試該操作。

此異常通常在並發 DELETE、UPDATE 或 MERGE 操作期間拋出。 雖然並發操作可能在物理上更新不同的分區目錄,但其中一個可能會讀取另一個同時更新的同一分區,從而導致沖突。 您可以通過在操作條件中明確分隔來避免這種情況。

當在映射中使用“更新策略”轉換時,將對 Delta Lake 目標表執行更新查詢。 當多個更新策略轉換用於同一個目標表時,多個更新查詢將並行執行,因此目標數據將不可預測。 由於並發 UPDATE 查詢的 Delta Lake 目標中不可預測的數據場景,不支持在映射中為每個“Databricks Delta Lake Table”使用多個“更新策略”轉換。 重新設計映射,使每個 Delta Lake 表有一個“更新策略”轉換。

解決方案 -

在為每個 Databricks Delta Lake 表運行帶有一個“更新策略”轉換的映射時,執行將成功完成。

參考 - https://docs.delta.io/latest/concurrency-control.html#avoid-conflicts-using-partitioning-and-disjoint-command-conditions

最初,受影響的表只有一個日期字段作為分區。 所以我用國家和日期字段對它進行了分區。 這個新分區創建了國家和日期目錄,但是日期分區的舊目錄仍然存在並且沒有被刪除。

在此處輸入圖像描述

顯然,這些目錄在嘗試同時讀取它們時導致了沖突。 我在具有正確分區的另一條路徑上創建了一個新的增量,然后將其替換在原始路徑上。 這允許刪除舊的分區目錄。

在此處輸入圖像描述

執行這些操作的唯一后果是我丟失了表的更改歷史記錄(時間旅行)。

暫無
暫無

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

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