クエリでファイルのメタデータを使用するUsing file metadata in queries

SQL オンデマンド クエリ サービスを使用すれば、フォルダーと複数ファイルに対するクエリに関する記事で説明されているように、複数のファイルとフォルダーに対応できます。The SQL on-demand Query service can address multiple files and folders as described in the Query folders and multiple files article. この記事では、クエリ内でファイル名とフォルダー名に関するメタデータ情報を使用する方法について説明します。In this article, you learn how to use metadata information about file and folder names in the queries.

場合によっては、結果セット内の特定の行に関連するファイル ソースまたはフォルダー ソースを把握しておく必要があります。Sometimes, you may need to know which file or folder source correlates to a specific row in the result set.

関数 filepath および filename を使用すれば、結果セット内にファイル名およびそのパスを返すことができます。You can use function filepath and filename to return file names and/or the path in the result set. また、それらを使用することで、ファイル名やフォルダー パスに基づいてデータをフィルター処理することもできます。Or you can use them to filter data based on the file name and/or folder path. これらの関数については、「filename 関数」と「filepath 関数」の構文セクションで説明されています。These functions are described in the syntax section filename function and filepath function. 以下で、サンプルに沿って簡単に説明します。Below you will find short descriptions along samples.

前提条件Prerequisites

最初の手順は、参照するストレージ アカウントを使用してデータベースを作成することです。Your first step is to create a database with a datasource that references storage account. 次に、そのデータベースに対してセットアップ スクリプトを実行して、オブジェクトを初期化します。Then initialize the objects by executing setup script on that database. このセットアップ スクリプトにより、これらのサンプルで使用されるデータ ソース、データベース スコープの資格情報、および外部ファイル形式が作成されます。This setup script will create the data sources, database scoped credentials, and external file formats that are used in these samples.

関数Functions

ファイル名Filename

この関数からは、行の生成元のファイル名が返されます。This function returns the file name that row originates from.

次のサンプルでは、2017 年の過去 3 か月間について NYC イエロー タクシーのデータ ファイルが読み取られ、ファイルごとの乗車数が返されます。The following sample reads the NYC Yellow Taxi data files for the last three months of 2017 and returns the number of rides per file. クエリの OPENROWSET 部分では、読み取るファイルを指定します。The OPENROWSET part of the query specifies which files will be read.

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 () を使用して、読み取るファイルをフィルター処理する方法を示します。The following example shows how filename() can be used in the WHERE clause to filter the files to be read. クエリの OPENROWSET 部分のフォルダー全体にアクセスし、WHERE 句内のファイルをフィルター処理します。It accesses the entire folder in the OPENROWSET part of the query and filters files in the WHERE clause.

結果は前の例と同じになります。Your results will be the same as the prior example.

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];

FilepathFilepath

filepath 関数からは、完全なパスまたは部分的なパスが返されます。The filepath function returns a full or partial path:

  • パラメーターを指定せずに呼び出した場合、行の生成元である完全なファイル パスが返されます。When called without a parameter, it returns the full file path that the row originates from.
  • パラメーターを指定して呼び出すと、パラメーターで指定した位置にあるワイルドカードと一致するパスの一部が返されます。When called with a parameter, it returns part of the path that matches the wildcard on the position specified in the parameter. たとえば、パラメーター値 1 の場合は、最初のワイルドカードと一致するパスの一部が返されます。For example, parameter value 1 would return part of the path that matches the first wildcard.

次のサンプルでは、2017 年の過去 3 か月間について、NYC イエロー タクシーのデータ ファイルが読み取られます。The following sample reads NYC Yellow Taxi data files for the last three months of 2017. ファイル パスごとの乗車数が返されます。It returns the number of rides per file path. クエリの OPENROWSET 部分では、読み取るファイルを指定します。The OPENROWSET part of the query specifies which files will be read.

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() を使用して、読み取るファイルをフィルター処理する方法を示します。The following example shows how filepath() can be used in the WHERE clause to filter the files to be read.

クエリの OPENROWSET 部分にワイルドカードを使用し、WHERE 句内のファイルをフィルター処理することができます。You can use the wildcards in the OPENROWSET part of the query and filter the files in the WHERE clause. 結果は前の例と同じになります。Your results will be the same as the prior example.

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;

次のステップNext steps

次の記事では、Parquet ファイルに対してクエリを実行する方法について説明します。In the next article, you'll learn how to query Parquet files.