演習 - PolyBase を使用して Parquet ファイルにクエリを実行する
この演習では、次の操作を行います。
- PolyBase をインストールして有効にします。
- データベースを作成します。
- データベース スコープ資格情報をセキュリティで保護するデータベース マスター キーを作成します。
- データ ソースにアクセスするためのデータベースにスコープされた資格情報を作成します。
- データ ソースを作成します。
- パブリック データ ソースに格納されているデータのクエリと操作。
- 外部ファイル形式と外部テーブルを作成します。
PolyBase のインストール
注
SQL Server 2025 では、Azure Blob Storage、Azure Data Lake Storage、または S3 互換のオブジェクト ストレージで Parquet、Delta、または CSV ファイルを照会するために、外部データ用 PolyBase クエリ サービス機能をインストールする必要はありません。 これらの機能は、SQL Server 2025 エンジンにネイティブです。 このセクションのインストールと有効化の手順は、RDBMS ソース (SQL Server、Oracle、Teradata、MongoDB、ODBC) にも接続する必要がある場合にのみ必要です。
初期セットアップ中に SQL Server インストール実行可能ファイルと共に PolyBase をインストールすることも、後で機能として追加することもできます。 SQL Server setup.exeの [機能の選択] ページで、[外部データの PolyBase クエリ サービス] を選択します。
注
前のSQL Serverセットアップ画面に示されているポート範囲 16450 から 16460 は、2022 年SQL Server廃止され、SQL Server 2025 では使用できない PolyBase スケールアウト グループにのみ適用されます。 SQL Server 2025 では、スケールアップ (単一ノード) 機能として PolyBase が実行されます。 PolyBase 外部データ アクセスにのみ追加のファイアウォール ポートは必要ありません。
PolyBase セットアップでは、 SQL Server PolyBase エンジンと SQL Server PolyBaseデータ移動という 2 つの PolyBase サービスがインストールされます。 PolyBase インストールの完全な情報と前提条件については、次を参照してください。
PolyBase を有効にする
サービスをインストールしたら、SQL Server Management Studio (SSMS) で SQL Server 2025 インスタンスに接続し、次のコマンドを実行して PolyBase を有効にします。
EXEC SP_CONFIGURE @CONFIGNAME = N'POLYBASE ENABLED', @CONFIGVALUE = 1;
RECONFIGURE;
注
SQL Server 2025 では、Azure Blob Storageから Parquet ファイルに対してクエリを実行するために PolyBase をインストールまたは有効にする必要はありません。これらの機能は、SQL Server 2025 エンジンにネイティブです。 上記のインストールと有効化の手順をスキップした場合は、データベースの作成に直接進むことができます。 インストールと有効化の手順は、RDBMS 接続 (SQL Server、Oracle、Teradata、MongoDB、ODBC) も必要な場合にのみ適用されます。
データベースの作成
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 Storage に格納されている公開されている COVID Parquet データセットを使用します。 作成したデータベース スコープの PublicCredential を使用して、接続を確立します。
場所の値:
- プレフィックス:
abs - Azure Storage アカウント:
pandemicdatalake - Azure Storage アカウントの完全なパス:
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 のデータベースに接続し、外部テーブルを作成します。