[英]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 表運行帶有一個“更新策略”轉換的映射時,執行將成功完成。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.