在 Azure Synapse Analytics 中使用無伺服器 SQL 集區查詢 Parquet 檔案

在本文中,您將瞭解如何使用無伺服器 SQL 集區撰寫查詢,以讀取 Parquet 檔案。

快速入門範例

OPENROWSET 函式可讓您藉由提供檔案的 URL 來讀取 parquet 檔案的內容。

讀取 parquet 檔案

查看檔案 PARQUET 內容最簡單的方式是提供檔案 URL 以 OPENROWSET 運作並指定 parquet FORMAT 。 如果檔案可供公開使用,或您的 Microsoft Entra 身分識別可以存取此檔案,您應該能夠使用查詢來查看檔案的內容,如下列範例所示:

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

請確定您可以存取此檔案。 如果您的檔案受到 SAS 金鑰或自訂 Azure 身分識別的保護,您必須設定 sql 登入 的伺服器層級認證。

重要

請確定您使用 UTF-8 資料庫定序(例如 Latin1_General_100_BIN2_UTF8 ),因為 PARQUET 檔案中的字串值會使用 UTF-8 編碼進行編碼。 PARQUET 檔案中的文字編碼與定序不符可能會導致非預期的轉換錯誤。 您可以使用下列 T-SQL 語句,輕鬆地變更目前資料庫的預設定序:ALTER DATABASE CURRENT COLLATE Latin1_General_100_BIN2_UTF8; 如需定序的詳細資訊,請參閱 Synapse SQL 支援的定序類型。

如果您使用定序, Latin1_General_100_BIN2_UTF8 則相較于其他定序,您會獲得額外的效能提升。 定 Latin1_General_100_BIN2_UTF8 序與 parquet 字串排序規則相容。 SQL 集區能夠消除 parquet 檔案的某些部分,這些檔案不會包含查詢中所需的資料(檔案/資料行區段剪除)。 如果您使用其他定序,則 parquet 檔案中的所有資料都會載入 Synapse SQL,而且篩選會在 SQL 程式中進行。 定 Latin1_General_100_BIN2_UTF8 序具有僅適用于 parquet 和 Cosmos DB 的額外效能優化。 缺點是,您失去細部比較規則,例如不區分大小寫。

資料來源使用量

上一個範例會使用檔案的完整路徑。 或者,您可以使用指向儲存體根資料夾的位置來建立外部資料源,並使用該資料來源和函式中 OPENROWSET 檔案的相對路徑:

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 金鑰或自訂身分識別來保護資料來源,您可以使用資料庫範圍認證來設定資料來源

明確指定架構

OPENROWSET 可讓您明確指定要使用 子句從檔案 WITH 讀取的資料行:

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

重要

請確定您要針對 子句中的所有 WITH 字串資料行指定一些 UTF-8 定序, Latin1_General_100_BIN2_UTF8 或在資料庫層級設定一些 UTF-8 定序。 檔案中的文字編碼與字串資料行定序之間的不符可能會導致非預期的轉換錯誤。 您可以使用下列 T-SQL 語句,輕鬆地變更目前資料庫的預設定序:ALTER DATABASE CURRENT COLLATE Latin1_General_100_BIN2_UTF8; 您可以輕鬆地在 Colum 類型上設定定序,例如:geo_id varchar(6) collate Latin1_General_100_BIN2_UTF8 如需定序的詳細資訊,請參閱 Synapse SQL 支援的定序類型。

在下列各節中,您可以看到如何查詢各種類型的 PARQUET 檔案。

必要條件

您的第一個步驟是 使用參考 NYC 黃色計程車 儲存體帳戶的資料來源來建立資料庫 。 然後,在該資料庫上執行 安裝腳本 來初始化物件。 此設定腳本會建立這些範例中使用的資料來源、資料庫範圍認證和外部檔案格式。

資料集

此範例會使用 NYC 黃色計程車 資料集。 您可以查詢 Parquet 檔案的方式與讀取 CSV 檔案 的方式相同 。 唯一的差別在於 FILEFORMAT 參數應該設定為 PARQUET 。 本文中的範例顯示讀取 Parquet 檔案的詳細資料。

Parquet 檔案的查詢集

當您查詢 Parquet 檔案時,只能指定感興趣的資料行。

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;

自動架構推斷

讀取 Parquet 檔案時,您不需要使用 OPENROWSET WITH 子句。 資料行名稱和資料類型會自動從 Parquet 檔案讀取。

請記住,如果您要一次讀取檔案數目,則會從第一個檔案服務從儲存體中推斷架構、資料行名稱和資料類型。 這可能表示會省略某些預期的資料行,全部是因為服務用來定義架構的檔案不包含這些資料行。 若要明確指定架構,請使用 OPENROWSET WITH 子句。

下列範例顯示 Parquet 檔案的自動架構推斷功能。 它會傳回 2018 年 9 月的資料列數目,而不指定架構。

注意

讀取 Parquet 檔案時,您不需要在 OPENROWSET WITH 子句中指定資料行。 在此情況下,無伺服器 SQL 集區查詢服務會利用 Parquet 檔案中的中繼資料,並依名稱系結資料行。

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

查詢分割區的資料

此範例中提供的資料集會分割為不同的子資料夾(分割)。 您可以使用 filepath 函式將特定的分割區做為目標。 此範例顯示 2017 年前三個月依年、月和payment_type的票價金額。

注意

無伺服器 SQL 集區查詢與 Hive/Hadoop 資料分割配置相容。

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;

類型對應

針對 Parquet 類型對應至 PARQUET 的 SQL 原生類型檢查 類型對應。

下一步

請前進到下一篇文章,以 瞭解如何查詢 Parquet 巢狀類型