次の方法で共有


サーバーレス SQL プールを使用してストレージ ファイルに対してクエリを実行する

サーバーレス SQL プールを使用すると、データ レイク内のデータに対してクエリを実行できます。 これには、半構造化と非構造化のデータのクエリに対応する Transact-SQL (T-SQL) クエリ領域が用意されています。 クエリでは、次の T-SQL の側面がサポートされています。

現在サポートされているものとされていないものの詳細については、サーバーレス SQL プールの概要、または以下の記事をご覧ください。

概要

Azure Storage ファイルに格納されているデータに対するインプレース クエリのスムーズなエクスペリエンスをサポートするために、サーバーレス SQL プールは、次の追加機能で OPENROWSET 関数を使用します。

PARQUET ファイルに対してクエリを実行する

Parquet ソース データに対してクエリを実行するには、FORMAT = 'PARQUET' を使用します。

SELECT * FROM
OPENROWSET( BULK N'https://myaccount.dfs.core.windows.net/mycontainer/mysubfolder/data.parquet', FORMAT = 'PARQUET') 
WITH (C1 int, C2 varchar(20), C3 varchar(max)) as rows

使用例については、「Parquet ファイルのクエリ」を参照してください。

CSV ファイルに対してクエリを実行する

CSV ソース データのクエリを実行するには、FORMAT = 'CSV' を使用します。 CSV ファイルに対してクエリを実行するときに、OPENROWSET 関数の一部として CSV ファイルのスキーマを指定できます。

SELECT * FROM
OPENROWSET( BULK N'https://myaccount.dfs.core.windows.net/mycontainer/mysubfolder/data.csv', FORMAT = 'CSV', PARSER_VERSION='2.0') 
WITH (C1 int, C2 varchar(20), C3 varchar(max)) as rows

解析規則をカスタム CSV 形式に合わせて調整するために使用できる追加オプションがいくつかあります。

  • ESCAPE_CHAR = 'char' は、ファイル内でそれ自体とすべての区切り記号の値をエスケープするために使用するファイル内の文字を指定します。 エスケープ文字の後にそれ自体以外の値、またはいずれかの区切り記号の値が続く場合は、その値を読み取るときにエスケープ文字が削除されます。 FIELDQUOTE が有効かどうかに関係なく、ESCAPE_CHAR パラメーターが適用されます。 引用文字をエスケープするために使用されることはありません。 引用文字は、別の引用文字でエスケープする必要があります。 引用文字は、値が引用文字で囲まれている場合にのみ、列の値の中で使用できます。
  • FIELDTERMINATOR ='field_terminator' は、使用するフィールド ターミネータを指定します。 既定のフィールド ターミネータはコンマ (,) です。
  • ROWTERMINATOR ='row_terminator'は、使用する行ターミネータを指定します。 既定の行ターミネータは、改行文字 (\r\n) です。

DELTA LAKE 形式に対してクエリを実行する

Delta Lake ソース データに対してクエリを実行するには、FORMAT = 'DELTA' を使用し、Delta Lake ファイルを含むルート フォルダーを参照します。

SELECT * FROM
OPENROWSET( BULK N'https://myaccount.dfs.core.windows.net/mycontainer/mysubfolder', FORMAT = 'DELTA') 
WITH (C1 int, C2 varchar(20), C3 varchar(max)) as rows

ルート フォルダーには、_delta_log というサブフォルダーを含める必要があります。 使用例については、Delta Lake (v1) ファイルのクエリを参照してください。

ファイル スキーマ

Synapse SQL の SQL 言語を使用すると、ファイルのスキーマを OPENROWSET 関数の一部として定義し、列のすべてまたはサブセットを読み取ることができます。または、スキーマ推論を使用して、ファイルから列の型を自動的に決定しようとします。

選択した列のサブセットを読み取る

読み取る列を指定するには、OPENROWSET ステートメント内にオプションの WITH 句を指定できます。

  • CSV データ ファイルがある場合、すべての列を読み取るには、列名とそのデータ型を指定します。 列のサブセットが必要な場合は、序数を使用して、元のデータ ファイルから序数で列を選択します。 列は、序数の指定によってバインドされます。
  • Parquet データ ファイルがある場合は、元のデータ ファイル内の列名と一致する列名を指定します。 列は名前でバインドされます。
SELECT * FROM
OPENROWSET( BULK N'https://myaccount.dfs.core.windows.net/mycontainer/mysubfolder/data.parquet', FORMAT = 'PARQUET') 
WITH (
      C1 int, 
      C2 varchar(20),
      C3 varchar(max)
) as rows;

列ごとに、列の名前と型を WITH 句で指定する必要があります。 サンプルについては、すべての列を指定せずに CSV ファイルを読み取るを参照してください。

スキーマ推論

OPENROWSET ステートメントから WITH 句を省略することで、基になるファイルからスキーマを自動検出 (推論) するようにサービスに指示できます。

SELECT * FROM
OPENROWSET( BULK N'https://myaccount.dfs.core.windows.net/mycontainer/mysubfolder/data.parquet', FORMAT = 'PARQUET') 

最適なパフォーマンスが得られる適切な推定データ型が使用されていることを確認してください。

複数のファイルまたはフォルダーに対してクエリを実行する

1 つのフォルダーまたは一連のフォルダー内にある一連のファイルを 1 つのエンティティまたは行セットとして扱いながら、それらに対して T-SQL クエリを実行するには、フォルダーのパス、または一連のファイルやフォルダーのパターン (ワイルドカードを使用) を指定します。

次の規則が適用されます。

  • パターンは、ディレクトリ パスの一部またはファイル名に使用できます。
  • 同じディレクトリ ステップまたはファイル名に複数のパターンを使用できます。
  • 複数のワイルドカードがある場合は、一致するすべてのパス内のファイルが、結果のファイル セットに含められます。
SELECT * FROM
OPENROWSET( BULK N'https://myaccount.dfs.core.windows.net/myroot/*/mysubfolder/*.parquet', FORMAT = 'PARQUET' ) as rows

使用例については、フォルダーと複数のファイルに対するクエリの実行を参照してください。

ファイル メタデータ関数

filename 関数

この関数は、行の生成元のファイル名を返します。

特定のファイルに対してクエリを実行するには、特定のファイルに対するクエリの実行に関する記事の「Filename」セクションをお読みください。

戻り値のデータ型は nvarchar(1024) です。 最適なパフォーマンスを確保するために、filename 関数の結果は必ず適切なデータ型にキャストしてください。 文字データ型を使用する場合は、適切な長さが使用されていることを確認します。

filepath 関数

この関数は、完全パスまたはパスの一部を返します。

  • パラメーターを指定せずに呼び出された場合、行の生成元である完全なファイル パスを返します。
  • パラメーターを指定して呼び出されると、パラメーターで指定された位置にあるワイルドカードと一致するパスの一部を返します。 たとえば、パラメーター値 1 は、最初のワイルドカードと一致するパスの一部を返します。

追加情報については、特定のファイルに対するクエリの実行に関する記事の「Filepath」セクションをお読みください。

戻り値のデータ型は nvarchar(1024) です。 最適なパフォーマンスを確保するために、filepath 関数の結果は必ず適切なデータ型にキャストしてください。 文字データ型を使用する場合は、適切な長さが使用されていることを確認します。

複合型と入れ子または繰り返しのデータ構造を操作する

Parquet ファイル内などの入れ子または繰り返しのデータ型に保存されているデータでのスムーズなエクスペリエンスを可能にするために、サーバーレス SQL プールに次の拡張機能が追加されています。

入れ子にされたデータまたは繰り返しのデータを射影する

データを映すには、入れ子にされたデータ型の列を含む Parquet ファイルに対して SELECT ステートメントを実行します。 出力時、入れ子にされた値は JSON にシリアル化され、varchar(8000) SQL データ型として返されます。

    SELECT * FROM
    OPENROWSET
    (   BULK 'unstructured_data_path' ,
        FORMAT = 'PARQUET' )
    [AS alias]

詳細については、Parquet の入れ子にされた型のクエリの記事の「入れ子または繰り返しのデータを映す」セクションを参照してください。

入れ子にされた列から要素にアクセスする

入れ子にされた列 (構造体など) から入れ子にされた要素にアクセスするには、"ドット表記" を使用して、フィールド名をパスに連結します。 OPENROWSET 関数の WITH 句に column_name としてパスを指定します。

構文フラグメントの例を次に示します。

    OPENROWSET
    (   BULK 'unstructured_data_path' ,
        FORMAT = 'PARQUET' )
    WITH ('column_name' 'column_type')
    [AS alias]
    'column_name' ::= '[field_name.] field_name'

既定で、OPENROWSET 関数では、ソース フィールド名とパスを、WITH 句に指定された列名と一致させます。 同じソース Parquet ファイル内の異なる入れ子レベルに含まれている要素には、WITH 句を使用してアクセスできます。

戻り値

  • 関数では、"入れ子にされた型" グループに含まれていないすべての Parquet の型について、指定した要素から、および指定したパスで、intdecimalvarchar などのスカラー値が返されます。
  • パスが、"入れ子にされた型" の要素を指している場合、関数は、指定されたパスの先頭の要素から始まる JSON フラグメントを返します。 JSON フラグメントの型は varchar(8000) です。
  • 指定された column_name でプロパティが見つからない場合、関数はエラーを返します。
  • 指定された column_path でプロパティが見つからない場合、パス モードに応じて、関数は、strict モードのときはエラーを、lax モードのときには null を返します。

クエリのサンプルについては、Parquet の入れ子にされた型のクエリの実行の「入れ子になったオブジェクト列からプロパティを読み取る」セクションを参照してください。

繰り返される列から要素にアクセスする

配列やマップの要素など、繰り返される列から要素にアクセスするには、映す必要があるすべてのスカラー要素に対して JSON_VALUE 関数を使用し、次を指定します。

  • 最初のパラメーターとして、入れ子にされた、または繰り返される列
  • 2 番目のパラメーターとして、アクセスする要素またはプロパティを指定する JSON パス

繰り返される列から非スカラー要素にアクセスするには、映す必要があるすべての非スカラー要素に対して JSON_QUERY 関数を使用し、次を指定します。

  • 最初のパラメーターとして、入れ子にされた、または繰り返される列
  • 2 番目のパラメーターとして、アクセスする要素またはプロパティを指定する JSON パス

次の構文フラグメントを参照してください。

    SELECT
       JSON_VALUE (column_name, path_to_sub_element),
       JSON_QUERY (column_name [ , path_to_sub_element ])
    FROM
    OPENROWSET
    (   BULK 'unstructured_data_path' ,
        FORMAT = 'PARQUET' )
    [AS alias]

繰り返される列から要素にアクセスするためのクエリのサンプルについては、Parquet の入れ子にされた型に対するクエリの実行に関する記事をご覧ください。

さまざまなファイルの種類に対してクエリを実行する方法、およびビューの作成と使用の詳細については、次の記事を参照してください。