在對應資料流程中更改資料列轉換
適用於:Azure Data Factory Azure Synapse Analytics
提示
試用 Microsoft Fabric 中的 Data Factory,這是適用於企業的全方位分析解決方案。 Microsoft Fabric 涵蓋從資料移動到資料科學、即時分析、商業智慧和報告的所有項目。 了解如何免費開始新的試用 (部分機器翻譯)!
Azure Data Factory 和 Azure Synapse Pipelines 中均可使用資料流。 本文適用於對應資料流。 如果您不熟悉轉換作業,請參閱簡介文章使用對應資料流轉換資料。
使用「更改資料列」轉換來設定資料列上的插入、刪除、更新和 upsert 原則。 您可以新增一對多條件做為運算式。 這些條件應依照優先順序來指定,因為每個資料列都會以對應至第一個相符運算式的原則來標記。 上述每一種條件都會導致插入、更新、刪除或更新插入一或多個資料列。 更改資料列可能會對您的資料庫產生 DDL 和 DML 動作。
更改資料列轉換只會在資料流程中的資料庫、REST 或 Azure Cosmos DB 接收上運作。 您指派給資料列的動作 (插入、更新、刪除、upsert) 不會在偵錯工作階段期間發生。 若要在您的資料庫資料表上制定更改資料列原則,請在管線中執行「執行資料流程」活動。
注意
對於使用 SQL Server 或 SAP 等原生 CDC 來源的變更資料擷取資料流程,不需要更改資料列轉換。 在這些案例中,ADF 會自動偵測資料列標記,因此更改資料列原則是非必要的。
指定預設資料列原則
建立「更改資料列」轉換,並指定具有 true()
條件的資料列原則。 不符合任何先前所定義運算式的每一個資料列都會針對指定的資料列原則進行標記。 根據預設,不符合任何條件運算式的每個資料列都會針對 Insert
進行標記。
注意
若要使用一個原則標示所有資料列,您可以建立該原則的條件,並將條件指定為 true()
。
在資料預覽中檢視原則
使用偵錯模式,在資料預覽窗格中檢視您更改資料列原則的結果。 更改資料列轉換的資料預覽不會針對您的目標產生 DDL 或 DML 動作。
每個更改資料列原則的圖示指出是否會發生插入、更新、upsert 或刪除動作。 頂端標頭會顯示預覽中每個原則影響多少資料列。
允許接收中的更改資料列原則
若要讓更改資料列原則運作,資料流必須寫入資料庫或 Azure Cosmos DB 接收。 在接收的 [設定] 索引標籤中,啟用針對該接收允許哪些更改資料列原則。
預設行為僅允許插入。 若要允許更新、upsert 或刪除,請核取與該條件對應的接收方塊。 如果已啟用更新、upsert 或刪除,您必須指定接收中要相符的索引鍵資料行。
注意
如果您的插入、更新或 upsert 會修改接收中目標資料表的結構描述,資料流程將會失敗。 若要修改資料庫中的目標結構描述,請選擇 [重新建立資料表] 作為資料表動作。 這樣會卸除並重新建立具有新結構描述定義的資料表。
接收轉換需要單一索引鍵或一系列索引鍵,以識別目標資料庫中的唯一資料列。 針對 SQL 接收,請在 [接收設定] 索引標籤中設定索引鍵。針對 Azure Cosmos DB,請在設定中設定分割區索引鍵,並亦在接收對應中設定 Azure Cosmos DB 系統欄位「識別碼」。 針對 Azure Cosmos DB,必須包含更新、upsert 和刪除的系統資料行「識別碼」。
與 Azure SQL Database 和 Azure Synapse 合併和 upsert
資料流程支援使用 upsert 選項,針對 Azure SQL Database 和 Azure Synapse 資料庫集區 (資料倉儲) 合併。
不過,您可能會遇到下列情況:目標資料庫結構描述已使用索引鍵資料行的身分識別屬性。 服務會要求您識別用來比對更新和 upsert 資料列值的索引鍵。 但是,如果目標資料行已設定身分識別屬性,而且您正在使用 upsert 原則,則目標資料庫不會允許您寫入至資料行。 當您嘗試針對分散式資料表的散發資料行進行 upsert 時,也可能會發生錯誤。
以下是修正此問題的方法:
移至接收轉換設定並設定 [跳過寫入索引鍵資料行]。 這會告訴服務不要寫入您已選取的資料行作為對應的索引鍵值。
如果該索引鍵資料行不是造成身分識別資料行問題的資料行,您可以使用接收轉換預先處理 SQL 選項:
SET IDENTITY_INSERT tbl_content ON
。 然後,使用後置處理 SQL 屬性將其關閉:SET IDENTITY_INSERT tbl_content OFF
。針對身分識別案例和散發資料行案例,您可以將邏輯從 Upsert 切換為使用個別的更新條件,以及使用條件式分割轉換的個別插入條件。 如此一來,您可以在更新路徑上設定對應,忽略索引鍵資料行對應。
資料流程指令碼
語法
<incomingStream>
alterRow(
insertIf(<condition>?),
updateIf(<condition>?),
deleteIf(<condition>?),
upsertIf(<condition>?),
) ~> <alterRowTransformationName>
範例
下列範例是名為 CleanData
的更改資料列轉換,會接受傳入資料流 SpecifyUpsertConditions
,並建立三個更改資料列條件。 在先前的轉換中,會計算名為 alterRowCondition
的資料行,以判斷資料列是否在資料庫中插入、更新或刪除。 如果資料行的值具有符合更改資料列規則的字串值,則其會獲指派該原則。
在 UI 中,這項轉換看起來如下圖所示:
此轉換的資料流指令碼位於下列程式碼片段中:
SpecifyUpsertConditions alterRow(insertIf(alterRowCondition == 'insert'),
updateIf(alterRowCondition == 'update'),
deleteIf(alterRowCondition == 'delete')) ~> AlterRow
相關內容
在「更改資料列」轉換之後,您可能會想要將資料接收至目的地資料存放區。