Aracılığıyla paylaş


POLYBase ile CSV dosyasını sanallaştırma

Şunlar için geçerlidir: SQL Server 2022 (16.x) ve sonraki sürümleri

SQL Server 2022 (16.x), verileri doğrudan CSV dosyalarından sorgulayabilir. Genellikle veri sanallaştırma olarak adlandırılan bu kavram, verilerin özgün konumunda kalmasına izin verir, ancak diğer tüm tablolar gibi T-SQL komutlarına sahip bir SQL Server örneğinden sorgulanabilir. Bu özellik PolyBase bağlayıcılarını kullanır ve ETL işlemleri aracılığıyla veri kopyalama gereksinimini en aza indirir.

Aşağıdaki örnekte CSV dosyası Azure Blob Depolama'da depolanır ve OPENROWSET veya bir dış tablo aracılığıyla erişilir.

Veri sanallaştırma hakkında daha fazla bilgi için PolyBase ile veri sanallaştırmaya giriş.

Önceden yapılandırma

1. PolyBase'i etkinleştirin sp_configure

exec sp_configure @configname = 'polybase enabled', @configvalue = 1;

RECONFIGURE;

2. Kullanıcı veritabanı oluşturma

Bu alıştırma, varsayılan ayarlara ve konuma sahip bir örnek veritabanı oluşturur. Bu boş örnek veritabanını verilerle çalışmak ve kapsamlı kimlik bilgilerini depolamak için kullanırsınız. Bu örnekte adlı CSV_Demo yeni bir boş veritabanı kullanılmıştır.

CREATE DATABASE [CSV_Demo];

3. Ana anahtar ve veritabanı kapsamlı kimlik bilgileri oluşturma

Kullanıcı veritabanındaki veritabanı ana anahtarı, veritabanı kapsamlı kimlik bilgisi gizli dizisini blob_storageşifrelemek için gereklidir.

USE [CSV_Demo];
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password';
CREATE DATABASE SCOPED CREDENTIAL blob_storage
WITH IDENTITY = '<user_name>', Secret = '<password>';

4. Dış veri kaynağı oluşturma

Dış veri kaynağı için veritabanı kapsamlı kimlik bilgileri kullanılır. Bu örnekte CSV dosyası Azure Blob Depolama'da yer alır, bu nedenle ön ekini absSHARED ACCESS SIGNATURE ve kimlik yöntemini kullanın. SQL Server 2022 (16.x) için yeni ayarlar da dahil olmak üzere bağlayıcılar ve önekler hakkında daha fazla bilgi için EXTERNAL DATA SOURCE OLUŞTURMA bölümüne bakın.

CREATE EXTERNAL DATA SOURCE Blob_CSV
WITH
(
 LOCATION = 'abs://<container>@<storage_account>.blob.core.windows.net'
,CREDENTIAL = blob_storage
);

Örneğin, depolama hesabınız adlandırılmışsa s3sampledata ve kapsayıcı adlandırılmışsa importkod şöyle olacaktır:

CREATE EXTERNAL DATA SOURCE Blob_CSV
WITH
(
 LOCATION = 'abs://import@s3sampledata.blob.core.windows.net'
,CREDENTIAL = blob_storage
)

Verilere erişmek için OPENROWSET kullanma

Bu örnekte, dosya olarak adlandırılır call_center.csvve veriler ikinci satırda başlar.

Dış veri kaynağı Blob_CSV bir kapsayıcı düzeyine eşlendiğinden. call_center.csv, kapsayıcının kökünde adlı 2022 bir alt klasörde bulunur. Klasör yapısındaki bir dosyayı sorgulamak için, dış veri kaynağının LOCATION parametresine göre bir klasör eşlemesi sağlayın.

SELECT * FROM OPENROWSET
(
    BULK '/2022/call_center.csv',
    FORMAT = 'CSV',
    DATA_SOURCE = 'Blob_CSV',
    FIRSTROW = 2
)
WITH (
    cc_call_center_sk INT,
    cc_call_center_id CHAR(16),
    cc_rec_start_date DATE,
    cc_rec_end_date DATE,
    cc_closed_date_sk INT,
    cc_open_date_sk INT,
    cc_name VARCHAR(50),
    cc_class VARCHAR(50),
    cc_employees INT,
    cc_sq_ft INT,
    cc_hours CHAR(20),
    cc_manager VARCHAR(40),
    cc_mkt_id INT,
    cc_mkt_class CHAR(50),
    cc_mkt_desc VARCHAR(100),
    cc_market_manager VARCHAR(40),
    cc_division INT,
    cc_division_name VARCHAR(50),
    cc_company INT,
    cc_company_name CHAR(50),
    cc_street_number CHAR(10),
    cc_street_name VARCHAR(60),
    cc_street_type CHAR(15),
    cc_suite_number CHAR(10),
    cc_city VARCHAR(60),
    cc_county VARCHAR(30),
    cc_state CHAR(2),
    cc_zip CHAR(10),
    cc_country VARCHAR(20),
    cc_gmt_offset DECIMAL(5, 2),
    cc_tax_percentage DECIMAL(5, 2)
) AS [cc];

Dış tabloyla verileri sorgulama

CREATE EXTERNAL TABLE, SQL Server'da CSV verilerini sanallaştırmak için de kullanılabilir. Sütunlar tanımlanmalı ve kesin olarak yazılmalıdır. Dış tabloları oluşturmak daha fazla çaba gerektirse de, OPENROWSET ile dış veri kaynağını sorgulamaya ek avantajlar sağlar. Şunları yapabilirsiniz:

  • Belirli bir sütun için veri yazma tanımını güçlendirme
  • Null durumu tanımlama
  • HARMANLAMA Tanımla
  • Sorgu planının kalitesini iyileştirmek için sütun için istatistikler oluşturma
  • Güvenlik modelinizi geliştirmek üzere veri erişimi için SQL Server'da daha ayrıntılı bir model oluşturma

Daha fazla bilgi için bkz. CREATE EXTERNAL TABLE.

Aşağıdaki örnek için aynı veri kaynağı kullanılır.

1. Dış dosya biçimi oluşturma

Dosyanın biçimlendirmesini tanımlamak için dış dosya biçimi gerekir. Yeniden kullanılabilirlik nedeniyle dış dosya biçimleri de önerilir.

Aşağıdaki örnekte veriler ikinci satırda başlar.

CREATE EXTERNAL FILE FORMAT csv_ff
WITH (
    FORMAT_TYPE = DELIMITEDTEXT,
    FORMAT_OPTIONS(
        FIELD_TERMINATOR = ',',
        STRING_DELIMITER = '"',
        FIRST_ROW = 2)
);

2. Dış tablo oluşturma

LOCATION, dış veri kaynağındaki konumun call_center.csv yoluna göre dosyanın klasör ve dosya yoludur ve DATA_SOURCE tarafından tanımlanır. Bu durumda, dosya adlı 2022bir alt klasörde bulunur. SQL Server'da dış dosya biçiminin yolunu belirtmek için csv_ff FILE_FORMAT kullanın.

CREATE EXTERNAL TABLE extCall_Center_csv (
    cc_call_center_sk INT NOT NULL,
    cc_call_center_id CHAR(16) NOT NULL,
    cc_rec_start_date DATE,
    cc_rec_end_date DATE,
    cc_closed_date_sk INT,
    cc_open_date_sk INT,
    cc_name VARCHAR(50),
    cc_class VARCHAR(50),
    cc_employees INT,
    cc_sq_ft INT,
    cc_hours CHAR(20),
    cc_manager VARCHAR(40),
    cc_mkt_id INT,
    cc_mkt_class CHAR(50),
    cc_mkt_desc VARCHAR(100),
    cc_market_manager VARCHAR(MAX),
    cc_division VARCHAR(50),
    cc_division_name VARCHAR(50),
    cc_company VARCHAR(60),
    cc_company_name CHAR(50),
    cc_street_number CHAR(10),
    cc_street_name VARCHAR(60),
    cc_street_type CHAR(15),
    cc_suite_number CHAR(10),
    cc_city VARCHAR(60),
    cc_county VARCHAR(30),
    cc_state CHAR(20),
    cc_zip CHAR(20),
    cc_country VARCHAR(MAX),
    cc_gmt_offset DECIMAL(5, 2),
    cc_tax_percentage DECIMAL(5, 2)
    )
WITH (
    LOCATION = '/2022/call_center.csv',
    DATA_SOURCE = Blob_CSV,
    FILE_FORMAT = csv_ff
);
GO