練習 - 使用 PolyBase 查詢 Parquet 檔案

已完成

在此練習中,您會:

  • 安裝並啟用PolyBase。
  • 建立資料庫。
  • 建立資料庫主要金鑰來保護資料庫範圍認證。
  • 建立資料庫範圍認證以存取數據源。
  • 建立數據源。
  • 查詢及操作儲存在公共數據資源中的資料。
  • 建立外部檔案格式和外部數據表。

安裝 Polybase

您可以在初始安裝期間使用 SQL Server 安裝可執行檔來安裝 PolyBase,或稍後將它新增為功能。 在 SQL Server setup.exe功能選取頁面上,選取 PolyBase 查詢服務以處理外部數據。

顯示 PolyBase 選項之 SQL Server 安裝程式可執行檔的影像。

PolyBase 服務需要啟用防火牆埠,才能連線到外部數據源。 根據預設,PolyBase 會使用範圍從 16450 到 16460 的埠。

顯示 PolyBase 連接埠範圍組態之 SQL Server 安裝程式可執行檔的影像。

PolyBase 安裝程式會安裝兩個 PolyBase 服務:SQL Server PolyBase 引擎SQL Server PolyBase 數據移動。 如需 PolyBase 安裝的完整資訊和必要條件,請參閱:

啟用 PolyBase

安裝服務之後,請連線到 SQL Server Management Studio (SSMS) 中的 SQL Server 2025 實例,然後執行下列命令以啟用 PolyBase。

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

在 SQL Server Management Studio 中使用 T-SQL 啟用 PolyBase 的影像。

備註

在此練習中,您會使用PolyBase REST API查詢 Apache Parquet 檔案,因此您不需要啟用或設定 SQL Server PolyBase 數據移動SQL Server PolyBase 引擎 服務。

建立資料庫

在 SSMS 中執行下列命令,為此練習建立一個名為 Demo1 的資料庫。 如果資料庫已建立,腳本會卸除並重新建立它。

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;

建立資料庫主要金鑰

您必須建立資料庫主要金鑰,以確保資料庫範圍認證安全性。 下列範例會建立具有隨機產生密碼的密鑰,而且需要備份。

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;

若要進一步瞭解和維護生產環境上的加密金鑰,請參閱:

建立資料庫範圍認證

資料庫範圍認證負責儲存數據源用來連線到端點的認證。 此範例會使用公用端點,因此認證不需要秘密。

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

建立資料來源

此範例會使用儲存在 Azure Blob 記憶體中的公開可用 COVID Parquet 數據集。 您可以使用您所建立的資料庫範圍 PublicCredential 來建立連線。

地點值:

  • 前置詞:abs
  • Azure 記憶體帳戶: pandemicdatalake
  • Azure 記憶體帳戶完整路徑: pandemicdatalake.blob.core.windows.net
  • 容器名稱: public
  • 容器完整路徑: 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]
);

使用 OPENROWSET 查詢數據

您可以使用 OPENROWSET 來存取和探索數據。 OPENROWSET 已針對即時工作負載和資料探索情境進行優化。

OPENROWSET 值:

  • BULK:檔案名稱和副檔名。 BULK 會自動附加至數據源資訊,因此完整檔案位置為 abs://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.parquet
  • 格式: PARQUET
  • DATA_SOURCE:連線資訊,在此情況下,您的新數據源 Public_Covid
SELECT TOP 1000 *
FROM OPENROWSET 
     (BULK 'bing_covid-19_data.parquet'
     , FORMAT = 'PARQUET'
     , DATA_SOURCE = 'Public_Covid')
     AS [COVID_Dataset]

下列範例會使用 T-SQL 彈性實時查詢 Parquet 檔案,就像一般數據表一樣。 若要以遞減順序傳回每個美國州已確認的案例數目,請執行下列查詢:

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

建立及查詢外部數據表

OPENROWSET 已針對臨機作執行和數據探索進行優化。 外部數據表更適合週期性存取,因為它們也可以使用統計數據。

探索外部數據表的架構

若要建立外部數據表,請先判斷數據行和類型。 架構來自外部檔案,因此可能很費時,才能精確地判斷數據類型和範圍。 幸運的是,您可以使用預存程式 sp_describe_first_result_set(Transact-SQL) 來加速此程式。

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;

SQL Server Management Studio 中外部 Parquet 數據源的架構結果影像。

您可以看到 sp_describe_first_result_set 返回了欄位名稱、類型、長度、精度,甚至是資料來源的排序規則。

建立外部檔案格式

因為您必須將 Parquet 檔案參考至外部數據表,因此您必須先執行 CREATE EXTERNAL FILE FORMAT 以新增 Parquet 檔格式。 檔案格式定義對於外部數據表很重要,因為它會指定實際的版面配置和壓縮類型。

執行下列命令:

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

建立外部資料表

最後,使用您剛才取得的所有資訊,以及所建立的外部檔格式,您可以使用下列腳本來建立外部數據表:

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;

備註

欄位名稱必須符合儲存在 Parquet 檔案中的欄位,否則 SQL Server 無法識別這些欄位,然後返回 NULL

建立外部數據表 ext_covid_data之後,您可以在更新的數據行上新增統計數據以提高效率。 如需外部資料表統計資料的詳細資訊,請參閱 CREATE STATISTICS (Transact-SQL)

在此單元中,您使用 PolyBase 連線到外部數據源,並使用 OPENROWSET 或外部數據表來查詢 Parquet 檔案。 在下一個練習中,您會使用PolyBase服務從 Azure SQL Database 中的資料庫連線及建立外部數據表。