在封裝工作流程中納入資料分析工作

適用於:SQL ServerAzure Data Factory 中的 SSIS Integration Runtime

在早期階段中,資料分析和清除並非自動化處理序的候選項目。 在 SQL Server Integration Services 中,資料分析工作的輸出通常需要進行視覺化分析和人為判斷,才能決定報告的違規項目是否有意義,或是否為過度報告。 甚至在辨識出資料品質問題之後,您仍然必須仔細地全盤規劃,尋求最佳的清除方法。

不過,當資料品質的準則確立之後,您可能會想要自動化資料來源的定期分析與清除作業。 請考慮這些狀況:

  • 在累加式載入之前檢查資料品質: 您可以使用資料剖析工作,針對 Customers 資料表中 CustomerName 資料行的新資料計算資料行 Null 比率設定檔。 如果 Null 值的百分比大於 20%,便傳送一則包含設定檔輸出的電子郵件訊息給操作員,然後結束封裝。 否則,則繼續增量載入。

  • 符合指定的條件時自動化清除: 使用資料剖析工作,根據州別查閱資料表計算 State 資料行的值包含設定檔,並根據郵遞區號查閱資料表計算 ZIP Code/Postal Code 資料行的值包含設定檔。 如果州值的包含強度小於 80%,但是郵遞區號值的包含強度大於 99%,這就代表兩件事。 首先,州的資料不正確。 其次,ZIP Code/郵遞區號資料良好。 啟動資料流程工作,根據目前的 Zip Code/Postal Code 值查找正確的州/省份值,以整理州/省份資料。

在您有了可納入資料流程工作的工作流程之後,就必須了解新增此工作所需的步驟。 下一節將描述合併資料流程工作的一般程序。 最後兩個章節說明如何將資料流程工作直接連線到資料來源,或連線到來自資料流程的轉換後資料。

定義資料流程工作的通用工作流程

下列程序概述如何在套件的工作流程中使用資料剖析工作輸出的一般方法。

在封裝中以程式方式使用資料剖析工作的輸出

  1. 在套件中新增及設定資料剖析工作。

  2. 設定封裝變數,以便保存您想要從設定檔結果中擷取的值。

  3. 新增並設定指令碼工作。 將指令碼工作連接至資料分析工作。 在指令碼工作中,撰寫從資料分析工作之輸出檔中讀取所需值並填入封裝變數的程式碼。

  4. 在將指令碼工作連接至工作流程中下游分支的優先順序條件約束中,撰寫使用變數值來導向工作流程的運算式。

將資料分析工作併入封裝的工作流程時,請記住此工作的兩個功能:

  • 任務輸出。 資料分析工作會根據 DataProfile.xsd 結構描述,以 XML 格式將其輸出寫入檔案或封裝變數中。 因此,如果您想要在封裝的條件式工作流程中使用設定檔結果,就必須查詢 XML 輸出。 您可以輕易地使用 Xpath 查詢語言來查詢這個 XML 輸出。 若要研究這個 XML 輸出的結構,您可以開啟範例輸出檔或結構描述本身。 若要開啟輸出檔案或結構描述,您可以使用 Microsoft Visual Studio、其他 XML 編輯器或文字編輯器 (例如,記事本)。

    注意

    某些顯示在「資料設定檔檢視器」中的設定檔結果是無法直接在輸出中找到的計算值。 例如,資料行 Null 比例設定檔的輸出包含了資料列總數以及含有 Null 值的資料列數目。 您必須查詢這兩個值,然後計算含有 Null 值的資料列百分比,才能取得資料行 Null 比例。

  • 工作輸入: 資料分析工作會從 SQL Server 資料表中讀取其輸入。 因此,如果您想要分析已經在資料流程中載入並轉換的資料,就必須將記憶體中的資料儲存至臨時資料表。

下列各節說明如何將此一般工作流程套用至直接來自外部資料來源,或經由 Data Flow 工作轉換而來的資料剖析。 此外,這些章節也會說明如何處理資料流程工作的輸入和輸出需求。

將資料分析工作直接連接至外部資料來源

資料分析工作可以分析直接來自某個資料來源的資料。 為了說明此能力,以下範例利用資料剖析任務計算 AdventureWorks2025 資料庫中 Person.Address 表格欄位的欄位零比剖面。 然後,這則範例會使用指令碼工作,從輸出檔中擷取結果並填入可用來導向工作流程的封裝變數。

注意

在這則簡易範例中,我們選取了 AddressLine2 資料行,因為這個資料行包含 Null 值的百分比很高。

這個範例包含下列步驟:

  • 設定用來連接外部資料來源及將包含分析結果之輸出檔案的連線管理員。

  • 設定封裝變數,以便保存資料分析工作所需的值。

  • 設定資料剖析工作,以計算資料行空值比例描述檔。

  • 設定指令碼工作以處理資料剖析工作所產生的 XML 輸出。

  • 設定優先順序條件約束,以便控制工作流程中的哪些下游分支會根據資料分析工作的結果執行。

設定連接管理員

在這則範例中,我們設有兩個連接管理員:

  • 一個連接 AdventureWorks2025 資料庫的 ADO.NET 連線管理器。

  • 建立輸出檔以便保存資料分析工作結果的檔案連接管理員。

設定連線管理員
  1. 在 SQL Server Data Tools (SSDT) 中,建立新的 Integration Services 套件。

  2. 將 ADO.NET 連線管理員新增至套件。 設定此連線管理器使用NET Data Provider for SQL Server(SqlClient),並連接至可用的AdventureWorks2025資料庫實例。

    根據預設,此連線管理員具有下列名稱:<伺服器名稱>.AdventureWorks1。

  3. 將檔案連接管理員加入至封裝。 設定此連線管理員,以建立資料剖析工作的輸出檔。

    這個範例會使用檔案名稱 DataProfile1.xml。 根據預設,此連接管理員與該檔案具有相同的名稱。

設定封裝變數

這個範例會使用兩個封裝變數:

  • ProfileConnectionName 變數會將檔案連接管理員的名稱傳遞給指令碼工作。

  • AddressLine2NullRatio 變數會將此資料行計算出的空值比例,從指令碼工作傳遞到封裝。

設定即將保存設定檔結果的封裝變數
  • 在 [變數] 視窗中,加入並設定下列兩個封裝變數:

    • 為其中一個變數輸入 ProfileConnectionName名稱,然後將這個變數的類型設定為 [String] 。

    • 為另一個變數輸入 AddressLine2NullRatio名稱,然後將這個變數的類型設定為 [Double] 。

設定資料剖析工作

資料剖析工作必須依下列方式設定:

  • 使用 ADO.NET 連線管理員所提供的資料作為輸入。

  • 對輸入資料執行資料行空值比例剖析。

  • 將設定檔結果儲存至與檔案連接管理員相關聯的檔案。

設定資料剖析工作
  1. 在控制流程中加入資料剖析工作。

  2. 開啟 [資料分析工作編輯器] 以便設定工作。

  3. 在編輯器的 [一般] 頁面中,針對 [目的地] 選取您先前設定之檔案連接管理員的名稱。

  4. 在編輯器的 設定檔請求 頁面上,建立新的資料行空值比例設定檔。

  5. 在 [要求屬性] 窗格中,為 ConnectionManager 選取您先前設定的 ADO.NET 連線管理員。 然後,針對 [TableOrView] 選取 Person.Address。

  6. 關閉資料剖析工作編輯器。

設定指令碼工作

您必須設定指令碼工作,以便從輸出檔中擷取結果,然後填入先前設定的封裝變數。

若要設定指令碼工作
  1. 在控制流程中,新增一個指令碼工作。

  2. 將指令碼工作連接至資料分析工作。

  3. 開啟 [指令碼工作編輯器] 以便設定工作。

  4. 在 [指令碼] 頁面中,選取您慣用的程式語言。 然後,讓這兩個封裝變數可供指令碼使用:

    1. 為 ReadOnlyVariables選取 ProfileConnectionName。

    2. 為 ReadWriteVariables選取 AddressLine2NullRatio。

  5. 選取 [編輯指令碼] 以便開啟指令碼開發環境。

  6. 加入對 System.Xml 命名空間的參考。

  7. 輸入對應至您程式語言的範例程式碼:

    Imports System  
    Imports Microsoft.SqlServer.Dts.Runtime  
    Imports System.Xml  
    
    Public Class ScriptMain  
    
      Private FILENAME As String = "C:\ TEMP\DataProfile1.xml"  
      Private PROFILE_NAMESPACE_URI As String = "https://schemas.microsoft.com/DataDebugger/"  
      Private NULLCOUNT_XPATH As String = _  
        "/default:DataProfile/default:DataProfileOutput/default:Profiles" & _  
        "/default:ColumnNullRatioProfile[default:Column[@Name='AddressLine2']]/default:NullCount/text()"  
      Private TABLE_XPATH As String = _  
        "/default:DataProfile/default:DataProfileOutput/default:Profiles" & _  
        "/default:ColumnNullRatioProfile[default:Column[@Name='AddressLine2']]/default:Table"  
    
      Public Sub Main()  
    
        Dim profileConnectionName As String  
        Dim profilePath As String  
        Dim profileOutput As New XmlDocument  
        Dim profileNSM As XmlNamespaceManager  
        Dim nullCountNode As XmlNode  
        Dim nullCount As Integer  
        Dim tableNode As XmlNode  
        Dim rowCount As Integer  
        Dim nullRatio As Double  
    
        ' Open output file.  
        profileConnectionName = Dts.Variables("ProfileConnectionName").Value.ToString()  
        profilePath = Dts.Connections(profileConnectionName).ConnectionString  
        profileOutput.Load(profilePath)  
        profileNSM = New XmlNamespaceManager(profileOutput.NameTable)  
        profileNSM.AddNamespace("default", PROFILE_NAMESPACE_URI)  
    
        ' Get null count for column.  
        nullCountNode = profileOutput.SelectSingleNode(NULLCOUNT_XPATH, profileNSM)  
        nullCount = CType(nullCountNode.Value, Integer)  
    
        ' Get row count for table.  
        tableNode = profileOutput.SelectSingleNode(TABLE_XPATH, profileNSM)  
        rowCount = CType(tableNode.Attributes("RowCount").Value, Integer)  
    
        ' Compute and return null ratio.  
        nullRatio = nullCount / rowCount  
        Dts.Variables("AddressLine2NullRatio").Value = nullRatio  
    
        Dts.TaskResult = Dts.Results.Success  
    
      End Sub  
    
    End Class  
    
    using System;  
    using Microsoft.SqlServer.Dts.Runtime;  
    using System.Xml;  
    
    public class ScriptMain  
    {  
    
      private string FILENAME = "C:\\ TEMP\\DataProfile1.xml";  
      private string PROFILE_NAMESPACE_URI = "https://schemas.microsoft.com/DataDebugger/";  
      private string NULLCOUNT_XPATH = "/default:DataProfile/default:DataProfileOutput/default:Profiles" + "/default:ColumnNullRatioProfile[default:Column[@Name='AddressLine2']]/default:NullCount/text()";  
      private string TABLE_XPATH = "/default:DataProfile/default:DataProfileOutput/default:Profiles" + "/default:ColumnNullRatioProfile[default:Column[@Name='AddressLine2']]/default:Table";  
    
      public void Main()  
      {  
    
        string profileConnectionName;  
        string profilePath;  
        XmlDocument profileOutput = new XmlDocument();  
        XmlNamespaceManager profileNSM;  
        XmlNode nullCountNode;  
        int nullCount;  
        XmlNode tableNode;  
        int rowCount;  
        double nullRatio;  
    
        // Open output file.  
        profileConnectionName = Dts.Variables["ProfileConnectionName"].Value.ToString();  
        profilePath = Dts.Connections[profileConnectionName].ConnectionString;  
        profileOutput.Load(profilePath);  
        profileNSM = new XmlNamespaceManager(profileOutput.NameTable);  
        profileNSM.AddNamespace("default", PROFILE_NAMESPACE_URI);  
    
        // Get null count for column.  
        nullCountNode = profileOutput.SelectSingleNode(NULLCOUNT_XPATH, profileNSM);  
        nullCount = (int)nullCountNode.Value;  
    
        // Get row count for table.  
        tableNode = profileOutput.SelectSingleNode(TABLE_XPATH, profileNSM);  
        rowCount = (int)tableNode.Attributes["RowCount"].Value;  
    
        // Compute and return null ratio.  
        nullRatio = nullCount / rowCount;  
        Dts.Variables["AddressLine2NullRatio"].Value = nullRatio;  
    
        Dts.TaskResult = Dts.Results.Success;  
    
      }  
    
    }  
    

    注意

    這個程序中顯示的範例程式碼會說明如何從檔案載入資料分析工作的輸出。 若要改為從套件變數載入資料剖析工作的輸出,請參閱本程序後方的替代範例程式碼。

  8. 關閉指令碼開發環境,然後關閉 [指令碼工作編輯器]。

替代程式碼 - 從變數中讀取設定檔輸出

上一個程序說明如何從檔案載入資料分析工作的輸出。 不過,我們提供了替代方法,可從封裝變數載入這個輸出。 若要從變數載入輸出,您必須對範例程式碼進行下列變更:

  • 呼叫 LoadXml 類別的 XmlDocument 方法,而非 Load 方法。

  • 在 [指令碼工作編輯器] 中,將包含設定檔輸出之封裝變數的名稱加入至工作的 ReadOnlyVariables 清單。

  • 將變數的字串值傳遞給 LoadXML 方法,如下列程式碼範例所示 (這個範例會使用 "ProfileOutput" 當做包含設定檔輸出之封裝變數的名稱)。

    Dim outputString As String  
    outputString = Dts.Variables("ProfileOutput").Value.ToString()  
    ...  
    profileOutput.LoadXml(outputString)  
    
    string outputString;  
    outputString = Dts.Variables["ProfileOutput"].Value.ToString();  
    ...  
    profileOutput.LoadXml(outputString);  
    

設定優先順序約束條件

您必須設定優先順序限制條件,以控制工作流程中哪些下游分支會根據資料剖析工作的結果執行。

設定先行條件約束
  • 在將指令碼工作連接至工作流程中下游分支的優先順序條件約束中,撰寫使用變數值來導向工作流程的運算式。

    例如,您可能會將優先順序條件約束的 [評估作業] 設定為 [運算式與條件約束] 。 然後,您可能會將 @AddressLine2NullRatio < .90 作為表達式的值。 當先前的工作成功,而且選取資料行中 Null 值的百分比小於 90% 時,這樣做會導致工作流程遵循選取的路徑。

將資料剖析工作連接至資料流程中的轉換後資料

除了分析直接來自資料來源的資料以外,您也可以分析已經在資料流程中載入並轉換的資料。 不過,資料分析工作只能針對保存的資料運作,無法針對記憶體中的資料運作。 因此,您必須先使用目的地元件,將已轉換的資料儲存至臨時資料表。

注意

設定資料分析工作時,您必須選取現有的資料表和資料行。 因此,您必須先在設計時期建立暫存資料表,然後才能設定任務。 換言之,這個狀況不允許您使用在執行階段建立的暫存資料表。

將資料儲存至臨時資料表之後,您就可以進行下列動作:

  • 使用資料剖析工作來剖析資料。

  • 使用指令碼工作來讀取結果,如本主題前文所述。

  • 使用這些結果來導向封裝的後續工作流程。

下列程序將提供使用資料分析工作來分析已經由資料流程轉換之資料的一般方法。 其中許多步驟都與先前針對分析直接來自外部資料來源之資料所描述的步驟相同。 如需有關如何設定各種元件的詳細資訊,您可能會想要檢閱先前的步驟。

在資料流程中使用資料剖析工作

  1. 在 SQL Server Data Tools (SSDT) 中,建立套件。

  2. 在資料流程中,加入、設定並連接適當的來源和轉換。

  3. 在資料流程中,加入、設定並連接將已轉換資料儲存至臨時資料表的目的地元件。

  4. 在控制流程中,新增並設定一個資料剖析工作,對暫存資料表中的已轉換資料計算所需的剖析。 將資料分析工作連接至資料流程工作。

  5. 設定封裝變數,以便保存您想要從設定檔結果中擷取的值。

  6. 新增並設定指令碼工作。 將指令碼工作連接至資料分析工作。 在指令碼工作中,撰寫從資料分析工作之輸出中讀取所需值並填入封裝變數的程式碼。

  7. 在將指令碼工作連接至工作流程中下游分支的優先順序條件約束中,撰寫使用變數值來導向工作流程的運算式。