PolyBase를 사용하여 델타 테이블 가상화

적용 대상: SQL Server 2022(16.x) 이상 버전

SQL Server 2022(16.x)는 델타 테이블 폴더에서 직접 데이터를 쿼리할 수 있습니다. 일반적으로 데이터 가상화라고 하는 이 개념을 사용하면 데이터가 원래 위치에 유지되지만 다른 테이블과 같은 T-SQL 명령을 사용하여 SQL Server 인스턴스에서 쿼리할 수 있습니다. 이 기능은 PolyBase 커넥터를 사용하며 ETL 프로세스를 통해 데이터를 복사할 필요성을 최소화합니다.

다음 예제에서 델타 테이블 폴더는 Azure Blob Storage에 저장되고 OPENROWSET 또는 외부 테이블을 통해 액세스됩니다.

데이터 가상화 에 대한 자세한 내용은 PolyBase를 사용한 데이터 가상화를 소개합니다.

미리 구성

1. 다음에서 PolyBase 사용 sp_configure

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에 있으므로 접두사 adlsSHARED 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을 사용하여 데이터 액세스

이 예제에서는 Data Table 폴더의 이름을 지정 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는 델타 테이블 폴더 또는 에 있는 절대 파일 자체를 LOCATION으로 사용할 수 있습니다 delta/Delta_yob/_delta_log/00000000000000000000.json.

-- 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을 전역적으로 사용하도록 설정하여 문제를 해결할 수 있으며 이로 인해 쿼리 힌트가 추가되지 않습니다.