Azure Synapse Analytics の SQL オンデマンド (プレビュー) を使用して Parquet ファイルに対してクエリを実行するQuery Parquet files using SQL on-demand (preview) in Azure Synapse Analytics

この記事では、Parquet ファイルを読み取る SQL オンデマンド (プレビュー) を使用してクエリを作成する方法について説明します。In this article, you'll learn how to write a query using SQL on-demand (preview) that will read Parquet files.

クイック スタートの例Quickstart example

OPENROWSET 関数を使用すると、ファイルの URL を指定することによって、Parquet ファイルの内容を読み取ることができます。OPENROWSET function enables you to read the content of parquet file by providing the URL to your file.

parquet ファイルの読み取りRead parquet file

PARQUET ファイルの内容を確認する最も簡単な方法は、OPENROWSET 関数にファイルの URL を指定し、parquet の FORMAT を指定することです。The easiest way to see to the content of your PARQUET file is to provide file URL to OPENROWSET function and specify parquet FORMAT. ファイルが一般公開されている場合、または Azure AD ID でこのファイルにアクセスできる場合は、次の例に示すようなクエリを使用して、ファイルの内容を表示することができます。If the file is publicly available or if your Azure AD identity can access this file, you should be able to see the content of the file using the query like the one shown in the following example:

select top 10 *
from openrowset(
    bulk 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/ecdc_cases/latest/ecdc_cases.parquet',
    format = 'parquet') as rows

このファイルにアクセスできることを確認してください。Make sure that you access this file. ファイルが SAS キーまたはカスタム Azure ID で保護されている場合は、SQL ログインのためのサーバーレベルの資格情報を設定する必要があります。If your file is protected with SAS key or custom Azure identity, your would need to setup server level credential for sql login.

データ ソースの使用状況Data source usage

前の例では、ファイルへの完全なパスを使用しています。Previous example uses full path to the file. 別の方法として、ストレージのルート フォルダーを示す場所を持つ外部データ ソースを作成し、そのデータ ソースとファイルへの相対パスを OPENROWSET 関数で使用することができます。As an alternative, you can create an external data source with the location that points to the root folder of the storage, and use that data source and the relative path to the file in OPENROWSET function:

create external data source covid
with ( location = 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/ecdc_cases' );
go
select top 10 *
from openrowset(
        bulk 'latest/ecdc_cases.parquet',
        data_source = 'covid',
        format = 'parquet'
    ) as rows

データ ソースが SAS キーまたはカスタム ID で保護されている場合は、データベーススコープ資格情報を使用してデータ ソースを構成できます。If a data source is protected with SAS key or custom identity you can configure data source with database scoped credential.

スキーマを明示的に指定するExplicitly specify schema

OPENROWSET を使用すると、WITH 句によってファイルから読み取る列を明示的に指定できます。OPENROWSET enables you to explicitly specify what columns you want to read from the file using WITH clause:

select top 10 *
from openrowset(
        bulk 'latest/ecdc_cases.parquet',
        data_source = 'covid',
        format = 'parquet'
    ) with ( date_rep date, cases int, geo_id varchar(6) ) as rows

次のセクションでは、さまざまな種類の PARQUET ファイルに対してクエリを実行する方法について説明します。In the following sections you can see how to query various types of PARQUET files.

前提条件Prerequisites

最初の手順は、NYC Yellow Taxi ストレージ アカウントを参照するデータソースでデータベースを作成することです。Your first step is to create a database with a datasource that references NYC Yellow Taxi 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.

データセットDataset

NYC Yellow Taxi データセットがこのサンプルで使用されます。NYC Yellow Taxi dataset is used in this sample. CSV ファイルを読み取るのと同じ方法で、Parquet ファイルに対してクエリを実行できます。You can query Parquet files the same way you read CSV files. 唯一の違いは、FILEFORMAT パラメーターを PARQUET に設定する必要があることです。The only difference is that the FILEFORMAT parameter should be set to PARQUET. この記事の例では、Parquet ファイルの読み取りについて詳細を示します。Examples in this article show the specifics of reading Parquet files.

Parquet ファイルのセットに対してクエリを実行するQuery set of parquet files

Parquet ファイルに対してクエリを実行する場合は、目的の列だけを指定できます。You can specify only the columns of interest when you query Parquet files.

SELECT
        YEAR(tpepPickupDateTime),
        passengerCount,
        COUNT(*) AS cnt
FROM  
    OPENROWSET(
        BULK 'puYear=2018/puMonth=*/*.snappy.parquet',
        DATA_SOURCE = 'YellowTaxi',
        FORMAT='PARQUET'
    ) WITH (
        tpepPickupDateTime DATETIME2,
        passengerCount INT
    ) AS nyc
GROUP BY
    passengerCount,
    YEAR(tpepPickupDateTime)
ORDER BY
    YEAR(tpepPickupDateTime),
    passengerCount;

自動スキーマ推論Automatic schema inference

Parquet ファイルを読み取るときに、OPENROWSET WITH 句を使用する必要はありません。You don't need to use the OPENROWSET WITH clause when reading Parquet files. 列名とデータ型は、Parquet ファイルから自動的に読み取られます。Column names and data types are automatically read from Parquet files.

次のサンプルは、Parquet ファイルを対象にした自動スキーマ推論機能を示しています。The sample below shows the automatic schema inference capabilities for Parquet files. この場合はスキーマを指定しなくても 2017 年 9 月の行の数が返されます。It returns the number of rows in September 2017 without specifying a schema.

注意

Parquet ファイルを読み取るときに OPENROWSET WITH 句で列を指定する必要はありません。You don't have to specify columns in the OPENROWSET WITH clause when reading Parquet files. この場合、SQL オンデマンド Query サービスでは Parquet ファイル内のメタデータが利用され、名前によって列がバインドされます。In that case, SQL on-demand Query service will utilize metadata in the Parquet file and bind columns by name.

SELECT TOP 10 *
FROM  
    OPENROWSET(
        BULK 'puYear=2018/puMonth=*/*.snappy.parquet',
        DATA_SOURCE = 'YellowTaxi',
        FORMAT='PARQUET'
    ) AS nyc

パーティション分割されたデータに対してクエリを実行するQuery partitioned data

このサンプルで指定されたデータ セットは、個別のサブフォルダーに分割 (パーティション分割) されます。The data set provided in this sample is divided (partitioned) into separate subfolders. filepath 関数を使用して、特定のパーティションをターゲットにすることができます。You can target specific partitions using the filepath function. この例では、2017 年の最初の 3 か月について、年、月、および payment_type 別の料金が示されています。This example shows fare amounts by year, month, and payment_type for the first three months of 2017.

注意

SQL オンデマンド クエリは、Hive/Hadoop パーティション構成と互換性があります。The SQL on-demand Query is compatible with Hive/Hadoop partitioning scheme.

SELECT
        YEAR(tpepPickupDateTime),
        passengerCount,
        COUNT(*) AS cnt
FROM  
    OPENROWSET(
        BULK 'puYear=*/puMonth=*/*.snappy.parquet',
        DATA_SOURCE = 'YellowTaxi',
        FORMAT='PARQUET'
    ) nyc
WHERE
    nyc.filepath(1) = 2017
    AND nyc.filepath(2) IN (1, 2, 3)
    AND tpepPickupDateTime BETWEEN CAST('1/1/2017' AS datetime) AND CAST('3/31/2017' AS datetime)
GROUP BY
    passengerCount,
    YEAR(tpepPickupDateTime)
ORDER BY
    YEAR(tpepPickupDateTime),
    passengerCount;

型のマッピングType mapping

Parquet ファイルには、すべての列の型の説明が含まれています。Parquet files contain type descriptions for every column. 次の表では、Parquet 型を SQL ネイティブ型にマップする方法について説明します。The following table describes how Parquet types are mapped to SQL native types.

Parquet 型Parquet type Parquet 論理型 (注釈)Parquet logical type (annotation) SQL データ型SQL data type
BOOLEANBOOLEAN bitbit
BINARY / BYTE_ARRAYBINARY / BYTE_ARRAY varbinaryvarbinary
DOUBLEDOUBLE floatfloat
FLOATFLOAT realreal
INT32INT32 INTint
INT64INT64 bigintbigint
INT96INT96 datetime2datetime2
FIXED_LEN_BYTE_ARRAYFIXED_LEN_BYTE_ARRAY binarybinary
BINARYBINARY UTF8UTF8 varchar *(UTF8 照合順序)varchar *(UTF8 collation)
BINARYBINARY STRINGSTRING varchar *(UTF8 照合順序)varchar *(UTF8 collation)
BINARYBINARY ENUMENUM varchar *(UTF8 照合順序)varchar *(UTF8 collation)
BINARYBINARY UUIDUUID UNIQUEIDENTIFIERuniqueidentifier
BINARYBINARY DECIMALDECIMAL decimaldecimal
BINARYBINARY JSONJSON varchar(max) *(UTF8 照合順序)varchar(max) *(UTF8 collation)
BINARYBINARY BSONBSON varbinary(max)varbinary(max)
FIXED_LEN_BYTE_ARRAYFIXED_LEN_BYTE_ARRAY DECIMALDECIMAL decimaldecimal
BYTE_ARRAYBYTE_ARRAY INTERVALINTERVAL varchar(max)、標準化された形式にシリアル化varchar(max), serialized into standardized format
INT32INT32 INT(8, true)INT(8, true) smallintsmallint
INT32INT32 INT(16, true)INT(16, true) smallintsmallint
INT32INT32 INT(32, true)INT(32, true) INTint
INT32INT32 INT(8, false)INT(8, false) tinyinttinyint
INT32INT32 INT(16, false)INT(16, false) INTint
INT32INT32 INT(32, false)INT(32, false) bigintbigint
INT32INT32 DATEDATE datedate
INT32INT32 DECIMALDECIMAL decimaldecimal
INT32INT32 TIME (MILLIS)TIME (MILLIS ) timetime
INT64INT64 INT(64, true)INT(64, true) bigintbigint
INT64INT64 INT(64, false)INT(64, false ) decimal (20,0)decimal(20,0)
INT64INT64 DECIMALDECIMAL decimaldecimal
INT64INT64 TIME (MICROS / NANOS)TIME (MICROS / NANOS) timetime
INT64INT64 TIMESTAMP (MILLIS / MICROS / NANOS)TIMESTAMP (MILLIS / MICROS / NANOS) datetime2datetime2
複合型Complex type リストLIST varchar(max)、JSON にシリアル化varchar(max), serialized into JSON
複合型Complex type MAPMAP varchar(max)、JSON にシリアル化varchar(max), serialized into JSON

次のステップNext steps

次の記事に進んで、Parquet の入れ子にされた型に対してクエリを実行する方法を学習してください。Advance to the next article to learn how to Query Parquet nested types.