PolyBase를 사용하여 델타 테이블 가상화
적용 대상: SQL Server 2022 (16.x) 이상 버전
SQL Server 2022(16.x)는 델타 테이블 폴더에서 직접 데이터를 쿼리할 수 있습니다. 일반적으로 데이터 가상화라고 하는 이 개념을 사용하면 데이터를 원래 위치에 유지할 수 있지만 다른 테이블과 마찬가지로 T-SQL 명령을 사용하여 SQL Server 인스턴스에서 쿼리할 수 있습니다. 이 기능에서는 PolyBase 커넥터를 사용하고 ETL 프로세스를 통해 데이터를 복사할 필요성을 최소화합니다.
다음 예제에서 델타 테이블 폴더가 Azure Blob Storage에 저장되고 OPENROWSET 또는 외부 테이블을 통해 액세스됩니다.
데이터 가상화에 대한 자세한 내용은 PolyBase를 사용한 데이터 가상화 소개를 참조하세요.
사전 구성
1. sp_configure
에서 PolyBase 사용
exec sp_configure @configname = 'polybase enabled', @configvalue = 1;
RECONFIGURE;
2. 사용자 데이터베이스 만들기
이 연습에서는 기본 설정 및 위치가 있는 샘플 데이터베이스를 만듭니다. 이 빈 샘플 데이터베이스를 사용하여 데이터를 작업하고 범위가 지정된 자격 증명을 저장합니다. 이 예제에서는 Delta_demo
라는 이름의 새 빈 데이터베이스가 사용됩니다.
CREATE DATABASE [Delta_demo];
3. 마스터 키 및 데이터베이스 범위 자격 증명 만들기
데이터베이스 범위 자격 증명 비밀인 delta_storage_dsc
을 암호화하는 데에는 데이터베이스 마스터 키가 사용됩니다. 이 예제에서는 델타 테이블이 Azure Data Lake Storage Gen2에 있습니다.
USE [Delta_demo];
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password';
CREATE DATABASE SCOPED CREDENTIAL delta_storage_dsc
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = '<SAS Token>';
4. 외부 데이터 원본 만들기
데이터베이스 범위 자격 증명은 외부 데이터 원본에 사용됩니다. 이 예제에서 델타 테이블은 Azure Data Lake Storage Gen2에 있으므로 접두사 adls
및 SHARED ACCESS SIGNATURE
ID 메서드를 사용합니다. SQL Server 2022(16.x)에 대한 새 설정을 포함하여 커넥터 및 접두사에 대한 자세한 내용은 CREATE EXTERNAL DATA SOURCE를 참조하세요.
CREATE EXTERNAL DATA SOURCE Delta_ED
WITH (
LOCATION = 'adls://<container>@<storage_account>.dfs.core.windows.net',
CREDENTIAL = delta_storage_dsc
);
예를 들어 스토리지 계정의 이름이 delta_lake_sample
이고 컨테이너 이름이 sink
인 경우 코드는 다음과 같습니다.
CREATE EXTERNAL DATA SOURCE Delta_ED
WITH (
LOCATION = 'adls://sink@delta_lake_sample.dfs.core.windows.net',
CREDENTIAL = delta_storage_dsc
);
OPENROWSET을 사용하여 데이터에 액세스
이 예제에서 데이터 테이블 폴더의 이름은 Contoso
입니다.
외부 데이터 원본 Delta_ED
은 컨테이너 수준에 매핑되어 있기 때문입니다. Contoso
델타 테이블 폴더는 루트에 있습니다. 폴더 구조에서 파일을 쿼리하려면 외부 데이터 원본의 LOCATION 매개 변수를 기준으로 폴더 매핑을 제공합니다.
SELECT * FROM OPENROWSET
(
BULK '/Contoso',
FORMAT = 'DELTA',
DATA_SOURCE = 'Delta_ED'
) AS [result];
외부 테이블로 데이터 쿼리
CREATE EXTERNAL TABLE을 사용하여 SQL Server에서 델타 테이블 데이터를 가상화할 수도 있습니다. 열을 정의하고 강력하게 입력해야 합니다. 외부 테이블을 만드는 데 더 많은 노력이 필요한 반면 OPENROWSET을 사용하여 외부 데이터 원본을 쿼리하는 경우 추가적인 이점도 제공합니다. 마케팅 목록의 구성원을 관리할 수 있습니다.
- 지정된 열에 대한 데이터 입력 정의 강화
- Null 허용 여부 정의
- 데이터 정렬 정의
- 쿼리 계획의 품질을 최적화하기 위해 열에 대한 통계 만들기
- 보안 모델을 향상시키고 데이터 액세스를 위해 SQL Server 내에서 보다 세분화된 모델 만들기
자세한 내용은 CREATE EXTERNAL TABLE을 참조하세요.
다음 예제에서는 동일한 데이터 원본이 사용됩니다.
1. 외부 파일 형식 만들기
파일의 서식을 정의하려면 외부 파일 형식이 필요합니다. 재사용 가능성 때문에 외부 파일 형식도 권장됩니다. 자세한 내용은 CREATE EXTERNAL FILE FORMAT을 참조하십시오.
CREATE EXTERNAL FILE FORMAT DeltaTableFormat WITH(FORMAT_TYPE = DELTA);
2. 외부 테이블 만들기
델타 테이블 파일은 /delta/Delta_yob/
에 있으며 이 예제의 외부 데이터 원본은 이전에 데이터 원본 s3_eds
아래에 구성된 S3 호환 개체 스토리지입니다. PolyBase는 델타 테이블 폴더 또는 delta/Delta_yob/_delta_log/00000000000000000000.json
에 있는 절대 파일 자체를 LOCATION으로 사용할 수 있습니다.
-- Create External Table using delta
CREATE EXTERNAL TABLE extCall_Center_delta (
id INT,
name VARCHAR(200),
dob DATE
)
WITH (
LOCATION = '/delta/Delta_yob/',
FILE_FORMAT = DeltaTableFormat,
DATA_SOURCE = s3_eds
);
GO
제한 사항
분할된 델타 테이블을 가리키는 외부 테이블을 만들면 외부 테이블을 쿼리할 때 분할에 사용되는 열이 NULL
를 반환됩니다. 그러나 OPENROWSET
쿼리를 사용하는 경우 열 값이 올바르게 반환됩니다. 이 제한을 해결하려면 OPENROWSET
쿼리에 대한 뷰를 만든 다음 뷰를 쿼리하여 올바르게 분할된 열 값을 반환합니다.
외부 델타 테이블을 쿼리할 때 다음 오류가 발생할 수 있습니다.
Msg 2571, Level 14, State 3, Line 1
User '<user>' does not have permission to run DBCC TRACEON.
Msg 16513, Level 16, State 0, Line 1
Error reading external metadata.
이는 델타 파일 메타데이터 쿼리에 추가할 수 있고 QUERYTRACEON
서버 역할을 실행해야 하는 sysadmin
쿼리 힌트가 있기 때문에 발생할 수 있습니다. 이 경우 추적 플래그 14073을 전역적으로 사용하도록 설정하여 문제를 해결할 수 있으며 이로 인해 쿼리 힌트가 추가되지 않습니다.