パッケージ ワークフローでのデータ プロファイル タスクの使用
データ プロファイルとクリーンアップは、初期段階で自動化されるプロセスの対象にはなりません。SQL ServerIntegration Services では、データ プロファイル タスクを出力する場合、通常、視覚的な分析とユーザーの判断によって、報告された違反が意味のあるものか過剰であるかを判断する必要があります。データ品質の問題を認識した後でも、クリーンアップに最適な方法に取り組む綿密な計画が必要です。
ただし、データ品質の基準が確立された後に、データ ソースの定期的な分析とクリーンアップを自動化することが必要になる場合があります。次のシナリオを考えてみます。
増分読み込みの前にデータ品質を確認する。データ プロファイル タスクを使用して、Customers テーブルの CustomerName 列のために、新しいデータの列の NULL 比プロファイルを計算します。NULL 値の比率が 20% を超える場合は、プロファイル出力を含む電子メールをオペレータに送信します。それ以外の場合は、増分読み込みを続行します。
指定した条件が満たされる場合にクリーンアップを自動化する。データ プロファイル タスクを使用し、州の参照テーブルに対して State 列、および郵便番号の参照テーブルに対して ZIP Code/Postal Code 列の値包含プロファイルを計算します。州の値の包含の強さが 80% 未満でも、郵便番号の値の包含の強さが 99% を超える場合は、2 つのことを示しています。1 つは州のデータが適切ではないこと、もう 1 つは郵便番号のデータは適切であることです。現在の郵便番号の値から正しい州の値の参照を実行することで州のデータをクリーンアップするデータ フロー タスクを起動します。
データ フロー タスクを組み込むことのできるワークフローを用意したら、このタスクを追加するために必要な手順を理解する必要があります。次のセクションでは、データ フロー タスクを組み込む一般的な手順について説明します。最後の 2 つのセクションでは、データ フロー タスクを直接データ ソースに接続する方法、またはデータ フローから変換されたデータに接続する方法について説明します。
データ フロー タスクの一般的なワークフローの定義
パッケージのワークフローでデータ プロファイル タスクの出力を使用するための一般的な方法の概要を次に示します。
データ プロファイル タスクの出力をパッケージ内でプログラムによって使用するには
パッケージにデータ プロファイル タスクを追加して構成します。
プロファイルの結果から取得する値を保持するようにパッケージ変数を構成します。
スクリプト タスクを追加して構成します。スクリプト タスクをデータ プロファイル タスクに接続します。スクリプト タスクで、必要な値をデータ プロファイル タスクの出力ファイルから読み取り、パッケージ変数を設定するコードを作成します。
スクリプト タスクをワークフロー内の下流の分岐に接続する優先順位制約では、変数の値を使用してワークフローを分ける式を作成します。
データ プロファイル タスクをパッケージのワークフローに組み込む場合は、このタスクの次の 2 つの機能に注意してください。
タスクの出力。データ プロファイル タスクは、DataProfile.xsd スキーマに従って、その出力をファイルまたはパッケージ変数に XML 形式で書き込みます。そのため、パッケージの条件ワークフローでプロファイルの結果を使用する場合は、XML 出力に対してクエリを実行する必要があります。Xpath クエリ言語を使用すると、この XML 出力に対して簡単にクエリを実行できます。この XML 出力の構造を調べるために、サンプルの出力ファイル、またはスキーマ自体を開くことができます。出力ファイルまたはスキーマを開くには、MicrosoftVisual Studio やその他の XML エディタ、またはメモ帳などのテキスト エディタを使用できます。
注意 Data Profile Viewer に表示されるプロファイルの結果には、出力で直接見つからない、計算された値もあります。たとえば、列の NULL 比プロファイルの出力には、行の総数と、NULL 値を含む行の総数が含まれます。列の NULL 比を取得するには、この 2 つの値に対してクエリを実行してから、NULL 値を含む行の比率を計算します。
タスクの入力。データ プロファイル タスクは、SQL Server テーブルからその入力を読み取ります。そのため、既にデータ フローに読み込まれて変換されたデータをプロファイルする場合は、メモリ内のデータをステージング テーブルに保存する必要があります。
ここでは、外部データ ソースから直接送信されるデータ、またはデータ フロー タスクから変換されるデータのプロファイルを実行する、この一般的なワークフローを適用します。また、データ フロー タスクの入出力の要件を扱う方法についても説明します。
外部データ ソースへの直接的なデータ プロファイル タスクの接続
データ プロファイル タスクでは、データ ソースから直接送信されるデータをプロファイルできます。この機能を説明するために、次の例では、データ プロファイル タスクを使用して、AdventureWorks データベースの Person.Address テーブルの列で列の NULL 比プロファイルを計算します。その後、この例では、スクリプト タスクを使用して出力ファイルから結果を取得し、ワークフローを分けるために使用できるパッケージ変数を設定します。
注意 |
---|
この簡単な例では、AddressLine2 列を選択しました。この列では NULL 値の比率が高くなっています。 |
この例は、次の手順で構成されます。
外部データ ソース、およびプロファイルの結果を格納する出力ファイルに接続する接続マネージャを構成します。
データ プロファイル タスクで必要な値を保持するパッケージ変数を構成します。
列の NULL 比プロファイルを計算するようにデータ プロファイル タスクを構成します。
データ プロファイル タスクからの XML 出力を処理するスクリプト タスクを構成します。
データ プロファイル タスクの結果に基づいて実行する、ワークフロー内の下流の分岐を制御する優先順位制約を構成します。
接続マネージャの構成
この例では、次の 2 つの接続マネージャがあります。
AdventureWorks データベースに接続する ADO.NET 接続マネージャ。
データ プロファイル タスクの結果を格納する出力ファイルを作成するファイル接続マネージャ。
接続マネージャを構成するには
Business Intelligence Development Studio で、新しい Integration Services パッケージを作成します。
ADO.NET 接続マネージャをパッケージに追加します。この接続マネージャを、.NET Data Provider for SQL Server (SqlClient) を使用して、AdventureWorks データベースの使用可能なインスタンスに接続するように構成します。
既定では、接続マネージャの名前は <server name>.AdventureWorks1 となります。
ファイル接続マネージャをパッケージに追加します。この接続マネージャを、データ プロファイル タスクの出力ファイルを作成するように構成します。
この例では、ファイル名 DataProfile1.xml を使用します。既定では、接続マネージャの名前はファイルと同じになります。
パッケージ変数の構成
この例では、2 つのパッケージ変数を使用します。
ProfileConnectionName 変数は、ファイル接続マネージャの名前をスクリプト タスクに渡します。
AddressLine2NullRatio 変数は、この列の計算された NULL 比をスクリプト タスクからパッケージに渡します。
プロファイルの結果を保持するパッケージ変数を構成するには
[変数] ウィンドウで、次の 2 つのパッケージ変数を追加して構成します。
一方の変数では、名前を「ProfileConnectionName」と入力し、データ型を String に設定します。
もう一方の変数では、名前を「AddressLine2NullRatio」と入力し、データ型を Double に設定します。
データ プロファイル タスクの構成
データ プロファイル タスクは、次のように構成する必要があります。
ADO.NET 接続マネージャが提供するデータを入力として使用します。
入力データに対して列の NULL 比プロファイルを実行します。
ファイル接続マネージャに関連付けられているファイルにプロファイルの結果を保存します。
データ プロファイル タスクを構成するには
制御フローにデータ プロファイル タスクを追加します。
[データ プロファイル タスク エディタ] を開き、タスクを構成します。
エディタの [全般] ページの [変換先] で、既に構成済みのファイル接続マネージャの名前を選択します。
エディタの [プロファイル要求] ページで、列の NULL 比プロファイルを新しく作成します。
[要求プロパティ] ペインの [接続マネージャ] で、既に構成済みの ADO.NET 接続マネージャを選択します。次に、[TableOrView] で Person.Address を選択します。
データ プロファイル タスク エディタを閉じます。
スクリプト タスクの構成
スクリプト タスクは、出力ファイルから結果を取得し、既に構成済みのパッケージ変数を設定するように構成する必要があります。
スクリプト タスクを構成するには
制御フローにスクリプト タスクを追加します。
スクリプト タスクをデータ プロファイル タスクに接続します。
スクリプト タスク エディタを開いて、タスクを構成します。
[スクリプト] ページで、使用するプログラミング言語を選択します。次に、2 つのパッケージ変数をスクリプトで使用できるようにします。
[ReadOnlyVariables] で ProfileConnectionName を選択します。
[ReadWriteVariables] で AddressLine2NullRatio を選択します。
[スクリプトの編集] を選択して、スクリプト開発環境を開きます。
System.Xml 名前空間への参照を追加します。
プログラミング言語に対応するサンプル コードを入力します。
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; } }
注意 この手順で示すサンプル コードでは、データ プロファイル タスクの出力をファイルから読み込む方法を示しています。パッケージ変数からデータ プロファイル タスクの出力を読み込むには、この手順の後に示す他のサンプル コードを参照してください。
スクリプト開発環境を閉じてから、スクリプト タスク エディタを閉じます。
変数からプロファイル出力を読み込むコード
上記の手順は、データ プロファイル タスクの出力をファイルから読み込む方法を示していますが、この出力をパッケージ変数から読み込む方法もあります。出力を変数から読み込むには、サンプル コードを次のように変更する必要があります。
Load メソッドではなく、XmlDocument クラスの LoadXml メソッドを呼び出します。
スクリプト タスク エディタで、プロファイル出力を格納するパッケージ変数の名前を、タスクの 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% 未満の場合に、選択したパスに沿って進みます。
データ フローから変換されたデータへのデータ プロファイル タスクの接続
データ ソースから直接データをプロファイルするのではなく、既にデータ フローに読み込まれて変換されたデータをプロファイルできます。ただし、データ プロファイル タスクは、メモリ内のデータではなく、持続データに対してしか動作しません。したがって、変換されたデータをステージング テーブルに保存するには、最初に、変換先コンポーネントを使用する必要があります。
注意 |
---|
データ プロファイル タスクを構成する場合は、既存のテーブルと列を選択する必要があります。そのため、タスクを構成するには、デザイン時にステージング テーブルを作成しておく必要があります。つまり、このシナリオでは、実行時に作成した一時テーブルを使用することはできません。 |
データをステージング テーブルに保存すると、次の操作を行うことができます。
データ プロファイル タスクを使用してデータをプロファイルする。
このトピックの前半で説明したように、スクリプト タスクを使用して結果を読み込む。
この結果を使用してパッケージの後続のワークフローを進む。
次の手順では、データ プロファイル タスクの出力を使用して、データ フローによって変換されたデータをプロファイルするための一般的な方法を示します。この手順の多くは、外部データ ソースから直接送信されるデータをプロファイルするための既に説明した手順と似ています。さまざまなコンポーネントを構成する方法の詳細については、上記の手順を確認してください。
データ フローでデータ プロファイル タスクを使用するには
Business Intelligence Development Studio で、パッケージを作成します。
データ フローで、適切な変換元と変換を追加、構成、および接続します。
データ フローで、変換したデータをステージング テーブルに保存する変換先コンポーネントを追加、構成、および接続します。
制御フローで、ステージング テーブル内の変換したデータに対して必要なプロファイルを計算するデータ プロファイル タスクを追加して構成します。データ プロファイル タスクをデータ フロー タスクに接続します。
プロファイルの結果から取得する値を保持するようにパッケージ変数を構成します。
スクリプト タスクを追加して構成します。スクリプト タスクをデータ プロファイル タスクに接続します。スクリプト タスクで、必要な値をデータ プロファイル タスクの出力から読み取り、パッケージ変数を設定するコードを作成します。
スクリプト タスクをワークフロー内の下流の分岐に接続する優先順位制約では、変数の値を使用してワークフローを分ける式を作成します。
|