PolyBase を使用して S3 互換オブジェクト ストレージ内の Parquet ファイルを仮想化する

適用対象: SQL Server 2022 (16.x)

SQL Server 2022 (16.x) では、Parquet ファイルからデータを仮想化できます。 このプロセスでは、データを元の場所に維持したまま、他のテーブルと同様に T-SQL コマンドを使用して SQL Server インスタンスからクエリを実行することができます。 この機能では PolyBase コネクタを使用して、抽出、変換、読み込み (ETL) プロセスの必要性を最小限に抑えます。

次の例では、S3 互換オブジェクト ストレージに格納されている Parquet ファイルを仮想化します。

データの仮想化に関する詳細については、「PolyBase によるデータ仮想化の概要」を参照してください

前提条件

S3 互換オブジェクト ストレージ統合機能を使用するには、次のツールとリソースが必要です。

  • SQL Server の PolyBase 機能をインストールします。
  • SQL Server Management Studio (SSMS) または Azure Data Studio をインストールします。
  • S3 互換ストレージ。
  • 作成されている S3 バケット。 SQL Server からバケットを作成または構成することはできません。
  • ユーザー (Access Key ID) と、シークレット (Secret Key ID) とその既知のユーザー。 両方を S3 オブジェクト ストレージ エンドポイントに対して認証する必要があります。
  • S3 ユーザーに対する ListBucket アクセス許可。
  • S3 ユーザーに対する ReadOnly アクセス許可。
  • TLS が構成されている必要があります。 すべての接続が HTTP ではなく HTTPS 経由で安全に送信されることを前提としています。 エンドポイントは、SQL Server OS ホストにインストールされている証明書によって検証されます。

権限

プロキシ ユーザーが S3 バケットのコンテンツを読み取るには、ユーザーが S3 エンドポイントに対して次のアクションを実行できるようにする必要があります:

  • ListBucket;
  • ReadOnly;

事前構成

  1. sp_configure で PolyBase を有効にする:
exec sp_configure @configname = 'polybase enabled', @configvalue = 1
;
RECONFIGURE
;
exec sp_configure @configname = 'polybase enabled'
;
  1. データベース スコープ資格情報を作成する前に、ユーザー データベースに資格情報を保護するためのマスター キーが必要です。 詳細については、「CREATE MASTER KEY」を参照してください。

データベース スコープ資格情報の作成

次のサンプル スクリプトでは、SQL Server のソース ユーザー データベースにデータベース スコープの資格情報 s3-dc を作成します。 詳細については、「CREATE DATABASE SCOPED CREDENTIAL (Transact-SQL)」を参照してください。

IF NOT EXISTS(SELECT * FROM sys.credentials WHERE name = 's3_dc')
BEGIN
 CREATE DATABASE SCOPED CREDENTIAL s3_dc
 WITH IDENTITY = 'S3 Access Key',
 SECRET = '<AccessKeyID>:<SecretKeyID>' ;
END

sys.database_scoped_credentials (Transact-SQL) を使用して、新しいデータベース スコープ資格情報を確認します。

SELECT * FROM sys.database_scoped_credentials;

外部データ ソースを作成する

次のサンプル スクリプトでは、SQL Server のソース ユーザー データベースに外部データ ソース s3_ds を作成します。 外部データ ソースは、s3_dc データベース スコープの資格情報を参照します。 詳しくは、「CREATE EXTERNAL DATA SOURCE」をご覧ください。

CREATE EXTERNAL DATA SOURCE s3_ds
WITH
(   LOCATION = 's3://<ip_address>:<port>/'
,   CREDENTIAL = s3_dc
);
GO

sys.external_data_sources を使用して新しい外部データ ソースを確認します。

SELECT * FROM sys.external_data_sources;

仮想ホスト URL

一部の S3 互換ストレージ システム (アマゾン ウェブ サービスなど) では、virtual_hosted スタイルの URL を使用して S3 バケットにフォルダー構造を実装します。 次の CONNECTION_OPTIONS を追加して、S3 バケット内のフォルダーの場所を指す外部テーブルを作成できるようにします (例: CONNECTION_OPTIONS = '{"s3":{"url_style":"virtual_hosted"}}')。

その CONNECTION_OPTIONS 設定がないと、フォルダーを指す外部テーブルに対してクエリを実行する時に、次のエラーが発生する可能性があります。

Msg 13807, Level 16, State 1, Line 23  
Content of directory on path '/<folder_name>/' cannot be listed. 

OPENROWSET を使用して Parquet ファイルから SELECT を実行する

次の例では、T-SQL を使用して、OPENROWSET クエリを介して S3 互換オブジェクト ストレージに格納されている Parquet ファイルに対してクエリを実行する方法を示します。 詳細については、「OPENROWSET (Transact-SQL)」を参照してください。

これは Parquet ファイルであるため、次の 2 つの重要な処理が自動的に行われます。

  1. SQL Server はファイル自体からスキーマを読み取るので、テーブル、列、またはデータ型を定義する必要はありません。
  2. 読み取るファイルの圧縮の種類を宣言する必要はありません。
SELECT  * 
FROM    OPENROWSET
        (   BULK '/<bucket>/<parquet_folder>'
        ,   FORMAT       = 'PARQUET'
        ,   DATA_SOURCE  = 's3_ds'
        ) AS [cc];

外部テーブルを使用して S3 互換のオブジェクト ストレージにクエリを実行する

次の例では、T-SQL を使用して、外部テーブルにクエリを実行して、S3 互換のオブジェクト ストレージに格納されている Parquet ファイルに対してクエリを実行する方法を示します。 このサンプルでは、外部データ ソース内の相対パスを使用します。

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

CREATE EXTERNAL TABLE Region (
r_regionkey BIGINT,
r_name CHAR(25),
r_comment VARCHAR(152) )
WITH (LOCATION = '/region/', DATA_SOURCE = 's3_ds', 
FILE_FORMAT = ParquetFileFormat);
GO

SELECT * FROM [Region];

詳細については、以下を参照してください:

制限事項

  1. S3 互換ストレージによってサポートされる外部テーブルに対する SQL Server クエリは、プレフィックスあたり 1,000 個のオブジェクトに制限されます。 これは、S3 互換オブジェクト リストがプレフィックスごとに 1,000 個のオブジェクト キーに制限されているためです。
  2. S3 互換のオブジェクト ストレージの場合、ユーザーは : 文字を含めてアクセス キー ID を作成することはできません。
  3. URL の長さは 259 文字に制限されます。 つまり、s3://<hostname>/<objectkey> を 259 文字以内にする必要があります。 s3:// は制限に対してカウントされるため、パスの長さは 259 - 5 = 254 文字を超えることはできません。
  4. SQL 資格情報名は、UTF-16 形式では 128 文字までに制限されています。
  5. 作成される資格情報名には、この資格情報が新しい外部データ ソース用でない限り、バケット名を含める必要があります。
  6. アクセス キー ID とシークレット キー ID には、英数字のみを含める必要があります。

次のステップ