在 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;
您可以在資料行類型上輕鬆設定定序,例如: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 原生類型檢查類型對應。