Övning – Använda PolyBase för att fråga en Parquet-fil

Slutförd

I den här övningen:

  • Installera och aktivera PolyBase.
  • Skapa en databas.
  • Skapa en databashuvudnyckel för att skydda databasens begränsade autentiseringsuppgifter.
  • Skapa en databasomfattande autentiseringsuppgift för åtkomst till datakällan.
  • Skapa datakällan.
  • Fråga efter och ändra data som lagras på den offentliga datakällan.
  • Skapa ett externt filformat och en extern tabell.

Installera PolyBase

Du kan installera PolyBase med sql Server-installationen körbar under den inledande installationen eller lägga till den som en funktion senare. På sidan Funktionsval i SQL Server setup.exeväljer du PolyBase Query Service för externa data.

Bild av den körbara konfigurationen av SQL Server som visar polybase-alternativet.

PolyBase-tjänster kräver att brandväggsportar aktiveras för att ansluta till externa datakällor. PolyBase använder som standard portar från 16450 till 16460.

Bild av den körbara konfigurationen av SQL Server som visar konfigurationen av PolyBase-portintervallet.

PolyBase-installationen installerar två PolyBase-tjänster, SQL Server PolyBase Engine och SQL Server PolyBase Data Movement. Fullständig information och förutsättningar för PolyBase-installation finns i:

Aktivera PolyBase

När du har installerat tjänsten ansluter du till SQL Server 2025-instansen i SQL Server Management Studio (SSMS) och kör följande kommando för att aktivera PolyBase.

EXEC SP_CONFIGURE @CONFIGNAME = N'POLYBASE ENABLED', @CONFIGVALUE = 1;
RECONFIGURE;

En bild av hur du aktiverar PolyBase med hjälp av T-SQL i SQL Server Management Studio.

Notera

I den här övningen kör du frågor mot Apache Parquet-filer med hjälp av PolyBase REST API, så du behöver inte aktivera eller konfigurera SQL Server PolyBase Data Movement - eller SQL Server PolyBase Engine-tjänsterna .

Skapa en databas

Kör följande kommando i SSMS för att skapa en databas för den här övningen med namnet Demo1. Om databasen redan har skapats släpper skriptet och återskapar den.

USE MASTER;

IF EXISTS (SELECT * FROM sys.databases WHERE [name] = N'Demo1')
BEGIN
    ALTER DATABASE Demo1 SET SINGLE_USER WITH ROLLBACK IMMEDIATE
    DROP DATABASE IF EXISTS Demo1
END;

CREATE DATABASE Demo1;

USE Demo1;

Skapa databasens huvudnyckel

Du måste skapa en databashuvudnyckel för att säkerställa säkerheten för databasomfattningen för autentiseringsuppgifter. I följande exempel skapas nyckeln med ett slumpmässigt genererat lösenord och en säkerhetskopia krävs.

DECLARE @randomWord VARCHAR(64) = NEWID();
DECLARE @createMasterKey NVARCHAR(500) = N'
IF NOT EXISTS (SELECT * FROM sys.symmetric_keys WHERE name = ''##MS_DatabaseMasterKey##'')
    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '  + QUOTENAME(@randomWord, '''')
EXECUTE sp_executesql @createMasterKey;

SELECT * FROM sys.symmetric_keys;

Mer information om och underhåll av krypteringsnycklar i en produktionsmiljö finns i:

Skapa en databasavgränsad behörighet

De databasbegränsade autentiseringsuppgifterna ansvarar för att förvara de behörigheter som datakällan använder för att ansluta till slutpunkten. I det här exemplet används en offentlig slutpunkt, så autentiseringsuppgifterna behöver ingen hemlighet.

IF EXISTS (SELECT * FROM sys.database_scoped_credentials WHERE name = N'PublicCredential')
    DROP DATABASE SCOPED CREDENTIAL PublicCredential;
 
CREATE DATABASE SCOPED CREDENTIAL PublicCredential
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = '<KEY>'; -- This example doesn't need the SECRET because the data source is public

Skapa datakällan

I det här exemplet används en offentligt tillgänglig COVID Parquet-datauppsättning som lagras i Azure Blob Storage. Du använder den databasomfattade PublicCredential du skapade för att upprätta anslutningen.

PLATSvärden:

  • Prefix: abs
  • Azure Storage-konto: pandemicdatalake
  • Fullständig sökväg för Azure Storage-konto: pandemicdatalake.blob.core.windows.net
  • Containernamn: public
  • Fullständig sökväg för container: public/curated/covid-19/bing_covid-19_data/latest
IF EXISTS (SELECT * FROM sys.external_data_sources WHERE name = N'Public_Covid') DROP EXTERNAL DATA SOURCE Public_Covid;
 
CREATE EXTERNAL DATA SOURCE Public_Covid
WITH (
    LOCATION = 'abs://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest',
    CREDENTIAL = [PublicCredential]
);
  • En fullständig lista över datakällor och motsvarande prefix finns i SKAPA EXTERN DATAKÄLLA.
  • Mer information om den offentliga datamängden finns i Bing COVID-19 .

Fråga data med OPENROWSET

Du kan använda OPENROWSET för att komma åt och utforska data. OPENROWSET är optimerat för scenarier för ad hoc-arbetsbelastning och datautforskning.

OPENROWSET-värden:

  • BULK: Filnamn och filnamnstillägg. BULK lägger automatiskt till datakällans information, så den fullständiga filplatsen är abs://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.parquet
  • FORMAT: PARQUET
  • DATA_SOURCE: Anslutningsinformation, i det här fallet din nya datakälla Public_Covid
SELECT TOP 1000 *
FROM OPENROWSET 
     (BULK 'bing_covid-19_data.parquet'
     , FORMAT = 'PARQUET'
     , DATA_SOURCE = 'Public_Covid')
     AS [COVID_Dataset]

I följande exempel används T-SQL-flexibilitet för att köra frågor mot Parquet-filen i realtid, precis som en vanlig tabell. Utför följande frågesats för att returnera antalet bekräftade fall per delstat i USA i fallande ordning:

SELECT [COVID_Dataset].admin_region_1, 
       SUM(CAST([COVID_Dataset].confirmed AS BIGINT)) AS Confirmed
FROM OPENROWSET 
     (BULK 'bing_covid-19_data.parquet'
     , FORMAT = 'PARQUET'
     , DATA_SOURCE = 'Public_Covid')
     AS [COVID_Dataset]
WHERE [COVID_Dataset].country_region = 'United States' AND 
      [COVID_Dataset].admin_region_1  IS NOT NULL
GROUP BY [COVID_Dataset].admin_region_1 
ORDER BY confirmed DESC

Skapa och fråga en extern tabell

OPENROWSET är optimerat för ad hoc-körning och datautforskning. Externa tabeller passar bättre för återkommande åtkomst, eftersom de också kan använda statistik.

Identifiera schemat för den externa tabellen

Om du vill skapa en extern tabell måste du först fastställa kolumnerna och typen. Schemat kommer från en extern fil, så det kan vara tidskrävande att exakt fastställa datatyper och intervall. Som tur är kan du använda den lagrade proceduren sp_describe_first_result_set (Transact-SQL) för att påskynda den här processen.

DECLARE @tsql NVARCHAR(MAX) = 'SELECT TOP 1000 *
FROM OPENROWSET 
    (BULK ''bing_covid-19_data.parquet''
    , FORMAT = ''PARQUET''
    , DATA_SOURCE = ''Public_Covid'')
    AS [COVID_Dataset]';
EXEC sys.sp_describe_first_result_set @tsql;

Bild av schemaresultatet för den externa Parquet-datakällan i SQL Server Management Studio.

Du kan se att sp_describe_first_result_set returnerade kolumnnamn, typer, längd, precision och till och med sortering av datakällan.

Skapa det externa filformatet

Eftersom du måste referera till Parquet-filen till den externa tabellen måste du först köra CREATE EXTERNAL FILE FORMAT för att lägga till Parquet-filformatet. Filformatsdefinitionen är viktig för externa tabeller eftersom den anger den faktiska layout- och komprimeringstypen.

Kör följande kommando:

IF EXISTS (SELECT * FROM sys.external_file_formats WHERE name = N'ParquetFileFormat')
      DROP EXTERNAL FILE FORMAT ParquetFileFormat;

CREATE EXTERNAL FILE FORMAT ParquetFileFormat WITH(FORMAT_TYPE = PARQUET);

Skapa den externa tabellen

Slutligen kan du skapa den externa tabellen med all information som du precis har hämtat och det externa filformatet som skapats med hjälp av följande skript:

IF EXISTS (SELECT * FROM sys.external_file_formats WHERE name = N'ParquetFileFormat')
      DROP EXTERNAL FILE FORMAT ParquetFileFormat;
 
CREATE EXTERNAL FILE FORMAT ParquetFileFormat WITH(FORMAT_TYPE = PARQUET);
 
-- 8.3 CREATE EXTERNAL TABLE
IF OBJECT_ID(N'ext_covid_data', N'ET') IS NOT NULL
      DROP EXTERNAL TABLE ext_covid_data;
 
CREATE EXTERNAL TABLE ext_covid_data
(
id                            int,
updated                       date,
confirmed               int,
confirmed_change  int,
deaths                        int,
deaths_change           smallint,
recovered               int,
recovered_change  int,
latitude                float,
longitude               float,
iso2                    varchar(8000),
iso3                    varchar(8000),
country_region          varchar(8000),
admin_region_1          varchar(8000),
iso_subdivision         varchar(8000),
admin_region_2          varchar(8000),
load_time                     datetime2(7)
)
WITH
(
LOCATION = 'bing_covid-19_data.parquet'
     , FILE_FORMAT = ParquetFileFormat
     , DATA_SOURCE = Public_Covid
);
 
CREATE STATISTICS [Stats_ext_covid_data_updated] ON ext_covid_data([updated]);
 
SELECT TOP 1000 * FROM ext_covid_data;

Notera

Kolumnnamnen måste matcha de kolumner som lagras i Parquet-filen, eller så kan SQL Server inte identifiera kolumnerna och returnerar NULL.

När du har skapat den externa tabellen ext_covid_datakan du lägga till statistik för de uppdaterade kolumnerna för effektivitet. Mer information om statistik i extern tabell finns i CREATE STATISTICS (Transact-SQL).

I den här lektionen använde du PolyBase för att ansluta till en extern datakälla och använde OPENROWSET eller en extern tabell för att fråga Parquet-filen. I nästa övning använder du PolyBase-tjänster för att ansluta till och skapa en extern tabell från en databas i Azure SQL Database.