練習 - 使用 PolyBase 查詢 Parquet 檔案
在此練習中,您會:
- 安裝並啟用PolyBase。
- 建立資料庫。
- 建立資料庫主要金鑰來保護資料庫範圍認證。
- 建立資料庫範圍認證以存取數據源。
- 建立數據源。
- 查詢及操作儲存在公共數據資源中的資料。
- 建立外部檔案格式和外部數據表。
安裝 Polybase
您可以在初始安裝期間使用 SQL Server 安裝可執行檔來安裝 PolyBase,或稍後將它新增為功能。 在 SQL Server setup.exe 的功能選取頁面上,選取 PolyBase 查詢服務以處理外部數據。
PolyBase 服務需要啟用防火牆埠,才能連線到外部數據源。 根據預設,PolyBase 會使用範圍從 16450 到 16460 的埠。
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;
備註
在此練習中,您會使用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]
);
- 如需數據源和對應前置詞的完整清單,請參閱 CREATE EXTERNAL DATA SOURCE。
- 如需公用數據集的詳細資訊,請參閱 Bing COVID-19。
使用 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;
您可以看到 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 中的資料庫連線及建立外部數據表。