패키지 워크플로에 데이터 프로파일링 태스크 포함
적용 대상: Azure Data Factory의 SQL Server
SSIS Integration Runtime
데이터 프로파일링과 정리는 초기 단계의 자동 처리 대상이 아닙니다. SQL Server Integration Services에서 데이터 프로파일링 태스크의 출력은 일반적으로 보고된 위반이 의미 있거나 과도한지 여부를 확인하기 위해 시각적 분석과 사람의 판단이 필요합니다. 데이터 품질 문제를 인식한 후에도 정리에 가장 적합한 방법을 해결하는 신중한 계획도 있어야 합니다.
그러나 데이터 품질 기준이 설정된 후에는 데이터 원본의 주기적인 분석 및 정리를 자동화할 수 있습니다. 다음과 같은 시나리오를 고려해 보십시오.
증분 로드 전에 데이터 품질 확인. 데이터 프로파일링 작업을 사용하여 Customers 테이블의 CustomerName 열에 대한 새 데이터의 열 Null 비율 프로필을 계산합니다. null 값의 백분율이 20%보다 큰 경우 프로필 출력이 포함된 전자 메일 메시지를 운영자에게 보내고 패키지를 종료합니다. 그렇지 않으면 증분 로드를 계속합니다.
지정된 조건이 충족되면 정리를 자동화. 데이터 프로파일링 작업을 사용하여 상태 조회 테이블에 대해 상태 열의 값 포함 프로필을 계산하고 우편 번호 조회 테이블에 대해 우편 번호/우편 번호 열을 계산합니다. 상태 값의 포함 강도가 80% 미만이지만 우편 번호/우편 번호 값의 포함 강도가 99%보다 크면 두 가지를 나타냅니다. 첫째, State 데이터가 잘못되었습니다. 둘째, 우편 번호 데이터가 좋습니다. 현재 우편 번호 값에서 올바른 상태 값을 조회하여 상태 데이터를 정리하는 데이터 흐름 작업을 시작합니다.
데이터 흐름 태스크를 통합할 수 있는 워크플로가 있으면 이 작업을 추가하는 데 필요한 단계를 이해해야 합니다. 다음 섹션에서는 데이터 흐름 태스크를 통합하는 일반적인 프로세스에 대해 설명합니다. 마지막 두 섹션에서는 데이터 흐름 태스크를 데이터 원본에 직접 연결하거나 데이터 흐름에서 변환된 데이터에 연결하는 방법을 설명합니다.
데이터 흐름 태스크에 대한 일반 워크플로 정의
다음 절차에서는 패키지 워크플로에서 데이터 프로파일링 태스크의 출력을 사용하는 일반적인 방법을 간략하게 설명합니다.
패키지에서 프로그래밍 방식으로 데이터 프로파일링 태스크의 출력을 사용하는 방법
패키지에서 데이터 프로파일링 작업을 추가하고 구성합니다.
프로필 결과에서 검색할 값을 저장하도록 패키지 변수를 구성합니다.
스크립트 태스크를 추가하고 구성합니다. 스크립트 태스크를 데이터 프로파일링 태스크에 연결합니다. 스크립트 태스크에서 데이터 프로파일링 태스크의 출력 파일에서 원하는 값을 읽고 패키지 변수를 채우는 코드를 작성합니다.
스크립트 태스크를 워크플로의 다운스트림 분기에 연결하는 선행 제약 조건에서는 변수 값을 사용하여 워크플로를 지시하는 식을 작성합니다.
데이터 프로파일링 태스크를 패키지의 워크플로에 통합하는 경우 작업의 다음 두 기능을 염두에 두어야 합니다.
작업 출력. 데이터 프로파일링 태스크는 DataProfile.xsd 스키마에 따라 XML 형식의 파일 또는 패키지 변수에 출력을 씁니다. 따라서 패키지의 조건부 워크플로에서 프로필 결과를 사용하려면 XML 출력을 쿼리해야 합니다. Xpath 쿼리 언어를 사용하여 이 XML 출력을 쉽게 쿼리할 수 있습니다. 이 XML 출력의 구조를 연구하려면 샘플 출력 파일 또는 스키마 자체를 열 수 있습니다. 출력 파일 또는 스키마를 열려면 Microsoft Visual Studio, 다른 XML 편집기 또는 메모장과 같은 텍스트 편집기를 사용할 수 있습니다.
참고 항목
데이터 프로필 뷰어에 표시되는 프로필 결과 중 일부는 출력에서 직접 찾을 수 없는 계산된 값입니다. 예를 들어 열 Null 비율 프로필의 출력에는 총 행 수와 null 값이 포함된 행 수가 포함됩니다. 이 두 값을 쿼리한 다음 null 값을 포함하는 행의 백분율을 계산하여 열 null 비율을 가져와야 합니다.
작업 입력. 데이터 프로파일링 태스크는 SQL Server 테이블에서 해당 입력을 읽습니다. 따라서 데이터 흐름에서 이미 로드 및 변환된 데이터를 프로파일링하려면 메모리에 있는 데이터를 준비 테이블에 저장해야 합니다.
다음 섹션에서는 외부 데이터 원본으로부터 직접 가져오거나 데이터 흐름 태스크에서 변환된 프로파일링 데이터에 이 일반 워크플로를 적용합니다. 또한 데이터 흐름 태스크의 입력 및 출력 요구 사항을 처리하는 방법을 보여 줍니다.
데이터 프로파일링 태스크를 외부 데이터 원본에 직접 연결
데이터 프로파일링 태스크는 데이터 원본에서 직접 제공되는 데이터를 프로파일링할 수 있습니다. 다음 예에서는 이 기능을 설명하기 위해 데이터 프로파일링 작업을 사용하여 AdventureWorks2022 데이터베이스에 있는 Person.Address 테이블의 열에서 열 Null 비율 프로필을 계산합니다. 그런 다음 스크립트 태스크를 사용하여 출력 파일에서 결과를 검색하고, 워크플로를 제어하는 데 사용할 수 있는 패키지 변수를 채웁니다.
참고 항목
이 간단한 예에서는 Null 값 비율이 높은 AddressLine2 열을 사용합니다.
이 예시는 다음 단계로 구성됩니다.
프로필 결과를 포함할 출력 파일과 외부 데이터 원본에 연결되는 연결 관리자를 구성합니다.
데이터 프로파일링 태스크에 필요한 값을 보유할 패키지 변수를 구성합니다.
열 Null 비율 프로필을 컴퓨팅하도록 데이터 프로파일링 태스크를 구성합니다.
데이터 프로파일링 태스크의 XML 출력을 작동하도록 스크립트 태스크를 구성합니다.
데이터 프로파일링 태스크의 결과를 바탕으로 실행할 워크플로의 다운스트림 분기를 제어하는 선행 제약 조건을 구성합니다.
연결 관리자 구성
이 예제에는 두 개의 연결 관리자가 있습니다.
AdventureWorks2022 데이터베이스에 연결되는 ADO.NET 연결 관리자
데이터 프로파일링 태스크의 결과를 저장할 출력 파일을 만드는 파일 연결 관리자
연결 관리자 구성 방법
SSDT(SQL Server Data Tools)에서 새 Integration Services 패키지를 만듭니다.
패키지에 ADO.NET 연결 관리자를 추가합니다. NET Data Provider for SQL Server(SqlClient)를 사용하고, 사용 가능한 AdventureWorks2022 데이터베이스 인스턴스에 연결하도록 이 연결 관리자를 구성합니다.
기본적으로 연결 관리자의 이름은 <server name>.AdventureWorks1입니다.
패키지에 파일 연결 관리자를 추가합니다. 데이터 프로파일링 태스크에 대한 출력 파일을 만들도록 이 연결 관리자를 구성합니다.
이 예제에서는 파일 이름 DataProfile1.xml을 사용합니다. 기본적으로 연결 관리자의 이름은 파일과 같습니다.
패키지 변수 구성
이 예에서는 다음과 같은 두 개의 패키지 변수를 사용합니다.
ProfileConnectionName 변수는 파일 연결 관리자의 이름을 스크립트 태스크에 전달합니다.
AddressLine2NullRatio 변수는 스크립트 태스크에서 이 열의 계산된 null 비율을 패키지에 전달합니다.
프로필 결과를 저장할 패키지 변수를 구성하는 방법
변수 창에서 다음 두 패키지 변수를 추가하고 구성합니다.
변수 중 하나에 대해 ProfileConnectionName이라는 이름을 입력하고 이 변수의 형식을 String으로 설정합니다.
다른 변수에 대해 AddressLine2NullRatio 이름을 입력하고 이 변수의 형식을 Double로 설정합니다.
데이터 프로파일링 태스크 구성
데이터 프로파일링 작업은 다음과 같은 방식으로 구성해야 합니다.
ADO.NET 연결 관리자가 입력으로 제공하는 데이터를 사용합니다.
입력 데이터에 대해 열 Null 비율 프로필을 수행합니다.
파일 연결 관리자와 연결된 파일에 프로필 결과를 저장합니다.
데이터 프로파일링 태스크를 구성하는 방법
제어 흐름에 데이터 프로파일링 작업을 추가합니다.
데이터 프로파일링 태스크 편집기를 열고 작업을 구성합니다.
편집기의 일반 페이지에서 대상에 대해 이전에 구성한 파일 연결 관리자의 이름을 선택합니다.
편집기의 프로필 요청 페이지에서 새 열 Null 비율 프로필을 만듭니다.
요청 속성 창의 ConnectionManager에서 이전에 구성한 ADO.NET 연결 관리자를 선택합니다. 그런 다음 TableOrView에 Person.Address를 선택합니다.
데이터 프로파일링 태스크 편집기를 닫습니다.
스크립트 태스크 구성
스크립트 태스크는 출력 파일에서 결과를 검색하고 이전에 구성된 패키지 변수를 채우도록 구성되어야 합니다.
스크립트 태스크를 구성하는 방법
제어 흐름에 스크립트 태스크를 추가합니다.
스크립트 태스크를 데이터 프로파일링 태스크에 연결합니다.
스크립트 태스크 편집기를 열고 작업을 구성합니다.
스크립트 페이지에서 원하는 프로그래밍 언어를 선택합니다. 그런 다음 스크립트에서 두 패키지 변수를 사용할 수 있도록 합니다.
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% 미만인 경우 지정된 경로를 따릅니다.
데이터 프로파일링 태스크를 데이터 흐름에서 변환된 데이터에 연결
데이터 원본으로부터 직접 데이터를 프로파일링하는 대신 이미 로드되어 데이터 흐름에서 변환된 데이터를 프로파일링할 수 있습니다. 그러나 데이터 프로파일링 작업은 메모리 내 데이터가 아닌 지속형 데이터에 대해서만 작동합니다. 따라서 먼저 대상 구성 요소를 사용하여 변환된 데이터를 준비 테이블에 저장해야 합니다.
참고 항목
데이터 프로파일링 작업을 구성할 때 기존 테이블 및 열을 선택해야 합니다. 따라서 작업을 구성하려면 디자인 타임에 준비 테이블을 만들어야 합니다. 즉, 이 시나리오에서는 런타임에 만든 임시 테이블을 사용할 수 없습니다.
준비 테이블에 데이터를 저장한 후 다음 작업을 수행할 수 있습니다.
데이터 프로파일링 작업을 사용하여 데이터를 프로파일링합니다.
스크립트 태스크를 사용하여 이 항목의 앞부분에서 설명한 대로 결과를 읽습니다.
이러한 결과를 사용하여 패키지의 후속 워크플로를 전달합니다.
다음 절차에서는 데이터 흐름에 의해 변환된 데이터를 데이터 프로파일링 태스크를 사용하여 프로파일링하기 위한 일반적인 방법을 보여 줍니다. 이러한 단계의 대부분은 외부 데이터 원본에서 직접 제공되는 프로파일링 데이터에 대해 앞에서 설명한 단계와 유사합니다. 다양한 구성 요소를 구성하는 방법에 대한 자세한 내용은 이전 단계를 검토하세요.
데이터 흐름에서 데이터 프로파일링 작업을 사용하는 방법
SSDT(SQL Server Data Tools)에서 패키지를 만듭니다.
데이터 흐름에서 적절한 원본 및 변환을 추가, 구성, 연결합니다.
데이터 흐름에서 변환된 데이터를 준비 테이블에 저장하는 대상 구성 요소를 추가, 구성 및 연결합니다.
제어 흐름에서 준비 테이블의 변환된 데이터에 대해 원하는 프로필을 계산하는 데이터 프로파일링 작업을 추가하고 구성합니다. 데이터 프로파일링 태스크를 데이터 흐름 태스크에 연결합니다.
프로필 결과에서 검색할 값을 저장하도록 패키지 변수를 구성합니다.
스크립트 태스크를 추가하고 구성합니다. 스크립트 태스크를 데이터 프로파일링 태스크에 연결합니다. 스크립트 태스크에서 데이터 프로파일링 태스크의 출력으로부터 원하는 값을 읽고 패키지 변수를 채우는 코드를 작성합니다.
스크립트 태스크를 워크플로의 다운스트림 분기에 연결하는 선행 제약 조건에서는 변수 값을 사용하여 워크플로를 지시하는 식을 작성합니다.