合並成
基於源表將一組更新、插入和刪除合並到目標增量表中。
此語句僅支持Delta Lake表。
語法
合並成target_table_name[target_alias]使用source_table_reference[source_alias]在merge_condition{當匹配[和matched_condition]然後matched_action|當不匹配[和not_matched_condition]然後not_matched_action}[...]matched_action{刪除|更新集*|更新集{列=[expr|默認的]}(,...]}not_matched_action{插入*|插入(column1(,...])值(expr|默認的](,...])
參數
一個表名標識正在修改的表。引用的表必須是Delta表。
一個表別名對於目標表。別名不能包含列列表。
一個表名標識要合並到目標表中的源表。
一個表別名對於源表。別名不能包含列列表。
一個關係的行如何與另一個關係的行組合。返回類型為BOOLEAN的表達式。
當匹配[和
matched_condition]
當匹配
子句在源行與目標表行匹配時執行merge_condition
和可選的match_condition
.matched_condition
必須是布爾表達式。刪除
刪除匹配的目標表行。
無條件刪除匹配項時,允許多個匹配項。無條件刪除不會有歧義,即使有多個匹配項。
更新
更新匹配的目標表行。
若要用源數據集的相應列更新目標Delta表的所有列,請使用
更新集*
.這相當於更新集col1=source.col1(,col2=source.col2…]
用於目標Delta表的所有列。因此,此操作假定源表與目標表中的列相同,否則查詢將拋出分析錯誤。請注意
當啟用自動模式遷移時,此行為將發生改變。看到自動模式演化獲取詳細信息。
自:磚11.2運行時您可以指定
默認的
作為expr
顯式地將列更新為其默認值。
如果有多個
當匹配
子句,然後按指定的順序對它們求值。每一個當匹配
子句,除了最後一個,必須有一個matched_condition
.如果沒有
當匹配
屬性匹配的源和目標行對的條件求值為truemerge_condition
,那麼目標行保持不變。當不匹配[和
not_matched_condition]
當不匹配
子句在源行與任何目標行不匹配時插入一行merge_condition
和可選的not_matched_condition
.not_matched_condition
必須是布爾表達式。插入*
用源數據集的相應列插入目標Delta表的所有列。這相當於
插入(col1(,col2…)值(source.col1(,source.col2…)
用於目標Delta表的所有列。此操作要求源表具有與目標表中相同的列。請注意
當啟用自動模式遷移時,此行為將發生改變。看到自動模式演化獲取詳細信息。
插入(...)值(...)
根據指定的列和相應的表達式生成新行。不需要指定目標表中的所有列。對於未指定的目標列,將插入列默認值,或者
零
如果沒有存在。自:磚11.1運行時您可以指定
默認的
作為表達式顯式插入目標列的默認列。
如果有多個
當不匹配
子句,然後按指定的順序對它們求值。所有當不匹配
從句,除了最後一個,必須有not_matched_condition
年代。
重要的
一個合並
如果源數據集的多行匹配,並試圖更新目標Delta表的相同行,則操作可能失敗。根據合並的SQL語義,這樣的更新操作是模糊的,因為它不清楚應該使用哪個源行來更新匹配的目標行。可以對源表進行預處理,以消除多個匹配的可能性。看到更改數據捕獲示例-it對更改數據集(即源數據集)進行預處理,在將更改應用到目標Delta表之前,隻保留每個鍵的最新更改。
例子
您可以使用合並成
用於複雜的操作,如重複數據刪除、上傳更改數據、應用SCD Type 2操作等。看到合並的例子舉幾個例子。