在 Azure Synapse Analytics 中使用無伺服器 SQL 集區建立及使用檢視

在本節中,您將了解如何建立和使用檢視來包裝無伺服器 SQL 集區查詢。 檢視可讓您重複使用這些查詢。 如果您想要使用工具 (例如 Power BI) 來搭配無伺服器 SQL 集區,也是需要檢視。

Prerequisites

您的第一個步驟是建立資料庫以便在其中建立檢視,並藉由在該資料庫上執行安裝指令碼,而初始化要在 Azure 儲存體上進行驗證所需的物件。 本文中的所有查詢將會在您的範例資料庫上執行。

外部資料檢視

您可以用建立一般 SQL Server 檢視的相同方式來建立檢視。 下列查詢會建立可讀取 population.csv 檔案的檢視。

注意

變更查詢中的第一行,也就是 [mydbname],以使用您所建立的資料庫。

USE [mydbname];
GO

DROP VIEW IF EXISTS populationView;
GO

CREATE VIEW populationView AS
SELECT * 
FROM OPENROWSET(
        BULK 'csv/population/population.csv',
        DATA_SOURCE = 'SqlOnDemandDemo',
        FORMAT = 'CSV', 
        FIELDTERMINATOR =',', 
        ROWTERMINATOR = '\n'
    )
WITH (
    [country_code] VARCHAR (5) COLLATE Latin1_General_BIN2,
    [country_name] VARCHAR (100) COLLATE Latin1_General_BIN2,
    [year] smallint,
    [population] bigint
) AS [r];

檢視使用包含儲存體根 URL的 EXTERNAL DATA SOURCE,作為 DATA_SOURCE 並在檔案加入相對檔案路徑。

Delta Lake 檢視

若要在 Delta Lake 資料夾上建立檢視,請在 BULK 選項取代指定檔案路徑後,指定根目錄的位置。

ECDC COVID-19 Delta Lake 資料夾

讀取 Delta Lake 資料夾資料的 OPENROWSET 函式會檢查資料夾結構,並自動識別檔案位置。

create or alter view CovidDeltaLake
as
select *
from openrowset(
           bulk 'covid',
           data_source = 'DeltaLakeStorage',
           format = 'delta'
    ) with (
           date_rep date,
           cases int,
           geo_id varchar(6)
           ) as rows

如需詳細資訊,請檢閱Synapse 無伺服器 SQL 集區自助頁面Azure Synapse分析已知問題

資料分割檢視

如果階層式資料夾結構中有一組分割的檔案,您可使用檔案路徑的萬用字元描述分割模式。 您可使用 FILEPATH 函式,公開部分的資料夾路徑,作為分割資料行。

CREATE VIEW TaxiView
AS SELECT *, nyc.filepath(1) AS [year], nyc.filepath(2) AS [month]
FROM
    OPENROWSET(
        BULK 'parquet/taxi/year=*/month=*/*.parquet',
        DATA_SOURCE = 'sqlondemanddemo',
        FORMAT='PARQUET'
    ) AS nyc

當您使用分割資料行篩選來查詢資料分割時,分割檢視可以改善查詢的效能。 不過,並非所有查詢都支援分割區消除,因此請務必遵循一些最佳做法。

若要確保資料分割消除,請避免在篩選中使用子查詢,因為它們可能會干擾排除資料分割的能力。 相反地,將子查詢的結果當做變數傳遞至篩選。

在 SQL 查詢中使用 JOIN 時,請將篩選述詞宣告為 NVARCHAR,以減少查詢計劃的複雜度,並增加正確資料分割消除的可能性。 分割區資料行通常會推斷為 NVARCHAR (1024) ,因此針對述詞使用相同的類型可避免隱含轉換的需求,這會增加查詢計劃複雜度。

Delta Lake 分割檢視

若要在 Data Lake Storage 上建立分割檢視,您可以直接指定根 Delta Lake 資料夾,而不必使用 FILEPATH 函式明確公開分割資料行:

CREATE OR ALTER VIEW YellowTaxiView
AS SELECT *
FROM  
    OPENROWSET(
        BULK 'yellow',
        DATA_SOURCE = 'DeltaLakeStorage',
        FORMAT='DELTA'
    ) nyc

OPENROWSET 函式會檢查基礎 Delta Lake 資料夾的結構,並自動識別和公開分割資料行。 如果您在查詢的 WHERE 子句放入分割資料行,即會自動完成分割刪除。

OPENROWSET 函式 (如此範例的 yellow) 的資料夾名稱與 DeltaLakeStorage 資料來源定義的 LOCATION URI 串連後,必須參考包含名為 _delta_log 子資料夾的根 Delta Lake 資料夾。

Yellow Taxi Delta Lake 資料夾

如需詳細資訊,請檢閱Synapse 無伺服器 SQL 集區自助頁面Azure Synapse分析已知問題

JSON 檢視

在檔案擷取結果集後,如果您要在結果集上執行額外的處理,以下檢視是不錯的選擇。 以剖析 JSON 檔案為例,我們必須套用 JSON 函式,擷取 JSON 文件中的值:

CREATE OR ALTER VIEW CovidCases
AS 
select
    *
from openrowset(
        bulk 'latest/ecdc_cases.jsonl',
        data_source = 'covid',
        format = 'csv',
        fieldterminator ='0x0b',
        fieldquote = '0x0b'
    ) with (doc nvarchar(max)) as rows
    cross apply openjson (doc)
        with (  date_rep datetime2,
                cases int,
                fatal int '$.deaths',
                country varchar(100) '$.countries_and_territories')

OPENJSON 函式會剖析 JSONL 檔案的每一行,包含 JSON 文件 (文字格式)。

容器上的 Azure Cosmos DB 檢視

如果容器上已啟用 Azure Cosmos DB 分析儲存體,即可在 Azure Cosmos DB 容器上建立檢視。 Azure Cosmos DB 帳戶名稱、資料庫名稱和容器名稱均應加入檢視,而唯讀存取金鑰應放置於檢視參考的資料庫範圍認證中。

CREATE DATABASE SCOPED CREDENTIAL MyCosmosDbAccountCredential
WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = 's5zarR2pT0JWH9k8roipnWxUYBegOuFGjJpSjGlR36y86cW0GQ6RaaG8kGjsRAQoWMw1QKTkkX8HQtFpJjC8Hg==';
GO
CREATE OR ALTER VIEW Ecdc
AS SELECT *
FROM OPENROWSET(
      PROVIDER = 'CosmosDB',
      CONNECTION = 'Account=synapselink-cosmosdb-sqlsample;Database=covid',
      OBJECT = 'Ecdc',
      CREDENTIAL = 'MyCosmosDbAccountCredential'
    ) with ( date_rep varchar(20), cases bigint, geo_id varchar(6) ) as rows

如需詳細資訊,請在 Azure Synapse Link 中使用無伺服器 SQL 集區來查詢 Azure Cosmos DB 資料

使用檢視

您可以在查詢中使用檢視,就像在 SQL Server 查詢中使用檢視一樣。

下列查詢會示範如何使用我們在建立檢視中建立的 population_csv 檢視。 此查詢會以遞減順序傳回各個國家/地區名稱和其 2019 年的人口數目。

注意

變更查詢中的第一行,也就是 [mydbname],以使用您所建立的資料庫。

USE [mydbname];
GO

SELECT
    country_name, population
FROM populationView
WHERE
    [year] = 2019
ORDER BY
    [population] DESC;

當您查詢檢視時,可能會遇到錯誤或非預期的結果。 這可能表示檢視參考已修改或已不存在的資料行或物件。 您必須手動調整檢視定義,以符合基礎架構變更。

後續步驟

如需有關如何查詢不同檔案類型的詳細資訊,請參閱查詢單一 CSV 檔案查詢 Parquet 檔案查詢 JSON 檔案文章。