Sdílet prostřednictvím


Virtualizace souboru CSV pomocí PolyBase

platí pro: SQL Server 2022 (16.x) a novější verze

SQL Server 2022 (16.x) může dotazovat data přímo ze souborů CSV. Tento koncept, běžně označovaný jako virtualizace dat, umožňuje, aby data zůstala v původním umístění, ale dají se dotazovat z instance SQL Serveru pomocí příkazů T-SQL, jako jsou všechny ostatní tabulky. Tato funkce používá konektory PolyBase a minimalizuje potřebu kopírování dat prostřednictvím procesů ETL.

V následujícím příkladu je soubor CSV uložený ve službě Azure Blob Storage a přistupuje se k němu přes OPENROWSET nebo externí tabulku.

Další informace o virtualizaci dat představujeme virtualizaci dat pomocí PolyBase.

Předkonfigurace

1. Povolení PolyBase v sp_configure

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

RECONFIGURE;

2. Vytvoření uživatelské databáze

Toto cvičení vytvoří ukázkovou databázi s výchozím nastavením a umístěním. Tuto prázdnou ukázkovou databázi použijete k práci s daty a uložení vymezených přihlašovacích údajů. V tomto příkladu se použije nová prázdná databáze s názvem CSV_Demo .

CREATE DATABASE [CSV_Demo];

3. Vytvořte hlavní klíč a přihlašovací údaje omezené na databázi

Hlavní klíč databáze v uživatelské databázi je nutný k šifrování tajného klíče přihlašovacích údajů s vymezeným oborem databáze. blob_storage

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

4. Vytvoření externího zdroje dat

Přihlašovací údaje s vymezeným oborem databáze se používají pro externí zdroj dat. V tomto příkladu se soubor CSV nachází ve službě Azure Blob Storage, takže použijte předponu abs a metodu SHARED ACCESS SIGNATURE identity. Další informace o konektorech a předponách, včetně nových nastavení pro SQL Server 2022 (16.x), najdete v tématu VYTVOŘENÍ EXTERNÍHO ZDROJE DAT.

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

Pokud je například váš účet úložiště pojmenovaný s3sampledata a kontejner má název import, kód by byl:

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

Použití OPENROWSET pro přístup k datům

V tomto příkladu je soubor pojmenován call_center.csva data začínají na druhém řádku.

Vzhledem k tomu, že externí zdroj Blob_CSV dat je mapován na úroveň kontejneru. Nachází se call_center.csv v podsložce nazvané 2022 v kořenovém adresáři kontejneru. Pokud chcete dotazovat soubor ve struktuře složek, zadejte mapování složek vzhledem k parametru LOCATION externího zdroje dat.

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];

Dotazování dat pomocí externí tabulky

CREATE EXTERNAL TABLE lze také použít k virtualizaci dat CSV na SQL Serveru. Sloupce musí být definovány a silně typovány. I když externí tabulky zabírají větší úsilí při vytváření, poskytují také další výhody při dotazování externího zdroje dat pomocí OPENROWSET. Můžete:

  • Posílení definice zadávání dat pro daný sloupec
  • Definování nulovatelnosti
  • Definujte kolaci
  • Vytvořte statistiky pro sloupec k optimalizaci kvality dotazovacího plánu
  • Vytvoření podrobnějšího modelu v RÁMCI SQL Serveru pro přístup k datům za účelem vylepšení modelu zabezpečení

Další informace naleznete v tématu VYTVOŘENÍ EXTERNÍ TABULKY.

V následujícím příkladu se používá stejný zdroj dat.

1. Vytvoření formátu externího souboru

K definování formátování souboru se vyžaduje externí formát souboru. Z důvodu opakovaného použití se doporučují také formáty externích souborů.

V následujícím příkladu začínají data na druhém řádku.

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

2. Vytvoření externí tabulky

LOCATION je složka a cesta k call_center.csv souboru vzhledem k cestě umístění v externím zdroji dat definovaná DATA_SOURCE. V tomto případě soubor leží v podsložce s názvem 2022. Pomocí FILE_FORMAT zadejte cestu k formátu externího csv_ff souboru v SQL Serveru.

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