PolyBase Transact-SQLリファレンス
適用対象: SQL Server
この記事では、PolyBase を使用して、さまざまな外部データ ソースに対して外部データをインプレースクエリする (データ仮想化と呼ばれます) 場合のオプションについてレビューします。
PolyBase で使用される T-SQL 構文
PolyBase を使用するには、外部テーブルを作成して、外部データを参照する必要があります。 以下を参照してください:
- CREATE DATABASE SCOPED CREDENTIAL (Transact-SQL)
- CREATE EXTERNAL DATA SOURCE (Transact-SQL)
- CREATE EXTERNAL FILE FORMAT (Transact-SQL)
- CREATE EXTERNAL TABLE (Transact-SQL)
- CREATE STATISTICS (Transact-SQL)
Note
PolyBase を使用するには、データベースでの sysadmin または CONTROL SERVER レベルのアクセス許可が必要です。
チュートリアル
クエリの例については、「 PolyBase Queries (PolyBase のクエリ)」を参照してください。
さまざまな外部データ ソースに関するチュートリアルについては、以下を参照してください。
- Hadoop
- Azure Blob Storage
- SQL Server
- Oracle
- Teradata
- MongoDB
- ODBC ジェネリック型
- S3 互換オブジェクト ストレージ
- CSV
- Delta テーブル
ファイル メタデータ関数
場合によっては、どのファイルまたはフォルダーのソースが、結果セット内の特定の行に関連付けられているかを知る必要があるかもしれません。
関数 filepath
および filename
を使用すれば、結果セット内にファイル名および、またはそのパスを返すことができます。 また、それらを使用することで、ファイル名やフォルダー パスに基づいてデータをフィルター処理することもできます。 以降のセクションでは、サンプルに沿って簡単な説明があります。
filename 関数
この関数は、行の生成元のファイル名を返します。
戻り値のデータ型は nvarchar(1024) です。 最適なパフォーマンスを確保するために、filename 関数の結果は必ず適切なデータ型にキャストしてください。 文字データ型を使用する場合は、適切な長さが使用されていることを確認します。
次のサンプルでは、2017 年の過去 3 か月間について NYC イエロー タクシーのデータ ファイルが読み取られ、ファイルごとの乗車数が返されます。 クエリの OPENROWSET
部分では、読み取るファイルを指定します。
SELECT
nyc.filename() AS [filename]
,COUNT_BIG(*) AS [rows]
FROM
OPENROWSET(
BULK 'parquet/taxi/year=2017/month=9/*.parquet',
DATA_SOURCE = 'SqlOnDemandDemo',
FORMAT='PARQUET'
) nyc
GROUP BY nyc.filename();
次の例では、WHERE
句で filename()
を使用して、読み取るファイルをフィルター処理する方法を示します。 クエリの OPENROWSET
部分のフォルダー全体にアクセスし、WHERE
句内のファイルをフィルター処理します。
結果は前の例と同じになります。
SELECT
r.filename() AS [filename]
,COUNT_BIG(*) AS [rows]
FROM OPENROWSET(
BULK 'csv/taxi/yellow_tripdata_2017-*.csv',
DATA_SOURCE = 'SqlOnDemandDemo',
FORMAT = 'CSV',
PARSER_VERSION = '2.0',
FIRSTROW = 2)
WITH (C1 varchar(200) ) AS [r]
WHERE
r.filename() IN ('yellow_tripdata_2017-10.csv', 'yellow_tripdata_2017-11.csv', 'yellow_tripdata_2017-12.csv')
GROUP BY
r.filename()
ORDER BY
[filename];
filepath 関数
この関数は、完全パスまたはパスの一部を返します。
- パラメーターを指定せずに呼び出された場合、行の生成元である完全なファイル パスを返します。
- パラメーターを指定して呼び出すと、パラメーターで指定された位置にあるワイルドカードと一致するパスの一部を返します。 たとえば、パラメーター値 1 は、最初のワイルドカードと一致するパスの一部を返します。
戻り値のデータ型は nvarchar(1024) です。 最適なパフォーマンスを確保するために、filepath
関数の結果は必ず適切なデータ型にキャストしてください。 文字データ型を使用する場合は、適切な長さが使用されていることを確認します。
次のサンプルでは、2017 年の過去 3 か月間について、NYC イエロー タクシーのデータ ファイルが読み取られます。 ファイル パスごとの乗車数が返されます。 クエリの OPENROWSET
部分では、読み取るファイルを指定します。
SELECT
r.filepath() AS filepath
,COUNT_BIG(*) AS [rows]
FROM OPENROWSET(
BULK 'csv/taxi/yellow_tripdata_2017-1*.csv',
DATA_SOURCE = 'SqlOnDemandDemo',
FORMAT = 'CSV',
PARSER_VERSION = '2.0',
FIRSTROW = 2
)
WITH (
vendor_id INT
) AS [r]
GROUP BY
r.filepath()
ORDER BY
filepath;
次の例では、WHERE
句で filepath()
を使用して、読み取るファイルをフィルター処理する方法を示します。
クエリの OPENROWSET
部分にワイルドカードを使用し、WHERE
句内のファイルをフィルター処理することができます。 結果は前の例と同じになります。
SELECT
r.filepath() AS filepath
,r.filepath(1) AS [year]
,r.filepath(2) AS [month]
,COUNT_BIG(*) AS [rows]
FROM OPENROWSET(
BULK 'csv/taxi/yellow_tripdata_*-*.csv',
DATA_SOURCE = 'SqlOnDemandDemo',
FORMAT = 'CSV',
PARSER_VERSION = '2.0',
FIRSTROW = 2
)
WITH (
vendor_id INT
) AS [r]
WHERE
r.filepath(1) IN ('2017')
AND r.filepath(2) IN ('10', '11', '12')
GROUP BY
r.filepath()
,r.filepath(1)
,r.filepath(2)
ORDER BY
filepath;