Dotazování souborů Parquet pomocí bezserverového fondu SQL ve službě Azure Synapse Analytics

V tomto článku se dozvíte, jak napsat dotaz pomocí bezserverového fondu SQL, který bude číst soubory Parquet.

Příklad rychlého startu

OPENROWSET funkce umožňuje číst obsah souboru parquet poskytnutím adresy URL souboru.

Čtení souboru parquet

Nejjednodušší způsob, jak zobrazit obsah PARQUET souboru, je zadat adresu URL souboru pro OPENROWSET funkci a zadat parquet FORMAT. Pokud je soubor veřejně dostupný nebo pokud má vaše identita Microsoft Entra přístup k tomuto souboru, měli byste být schopni zobrazit obsah souboru pomocí dotazu, jako je ten zobrazený v následujícím příkladu:

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

Ujistěte se, že máte přístup k tomuto souboru. Pokud je váš soubor chráněný klíčem SAS nebo vlastní identitou Azure, budete muset pro přihlášení SQL nastavit přihlašovací údaje na úrovni serveru.

Důležité

Ujistěte se, že používáte kolaci databáze UTF-8 (například Latin1_General_100_BIN2_UTF8), protože řetězcové hodnoty v souborech PARQUET jsou kódovány pomocí kódování UTF-8. Neshoda mezi kódováním textu v souboru PARQUET a kolací může způsobit neočekávané chyby převodu. Výchozí kolaci aktuální databáze můžete snadno změnit pomocí následujícího příkazu T-SQL: ALTER DATABASE CURRENT COLLATE Latin1_General_100_BIN2_UTF8; Další informace o kolacích najdete v tématu Typy kolace podporované pro Synapse SQL.

Pokud použijete Latin1_General_100_BIN2_UTF8 kolaci, získáte další zvýšení výkonu v porovnání s ostatními kolacemi. Kolace Latin1_General_100_BIN2_UTF8 je kompatibilní s pravidly řazení řetězců parquet. Fond SQL dokáže eliminovat některé části souborů parquet, které nebudou obsahovat data potřebná v dotazech (vyřadit soubor/sloupec). Pokud použijete další kolace, všechna data ze souborů parquet se načtou do Synapse SQL a filtrování probíhá v rámci procesu SQL. Kolace Latin1_General_100_BIN2_UTF8 má další optimalizaci výkonu, která funguje jenom pro parquet a Cosmos DB. Nevýhodou je, že ztratíte jemně odstupňovaná porovnávací pravidla, jako je případ necitlivost.

Využití zdroje dat

Předchozí příklad používá úplnou cestu k souboru. Jako alternativu můžete vytvořit externí zdroj dat s umístěním, které odkazuje na kořenovou složku úložiště, a použít tento zdroj dat a relativní cestu k souboru ve OPENROWSET funkci:

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

Pokud je zdroj dat chráněný klíčem SAS nebo vlastní identitou, můžete zdroj dat nakonfigurovat s přihlašovacími údaji v oboru databáze.

Explicitní zadání schématu

OPENROWSET umožňuje explicitně určit, které sloupce chcete ze souboru číst pomocí WITH klauzule:

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

Důležité

Ujistěte se, že pro všechny sloupce řetězců v WITH klauzuli zadáte určitou kolaci UTF-8 (napříkladLatin1_General_100_BIN2_UTF8) nebo nastavíte určitou kolaci UTF-8 na úrovni databáze. Neshoda mezi kódováním textu v kolaci sloupců souborů a řetězců může způsobit neočekávané chyby převodu. Výchozí kolaci aktuální databáze můžete snadno změnit pomocí následujícího příkazu T-SQL: ALTER DATABASE CURRENT COLLATE Latin1_General_100_BIN2_UTF8; Kolaci můžete snadno nastavit u typů columů, například: geo_id varchar(6) collate Latin1_General_100_BIN2_UTF8 Další informace o kolacích najdete v tématu Typy kolace podporované pro Synapse SQL.

V následujících částech se dozvíte, jak dotazovat různé typy souborů PARQUET.

Předpoklady

Prvním krokem je vytvoření databáze se zdroji dat, který odkazuje na účet úložiště taxislužby NYC Yellow Taxi . Potom objekty inicializujete spuštěním instalačního skriptu v této databázi. Tento instalační skript vytvoří zdroje dat, přihlašovací údaje s oborem databáze a formáty externích souborů, které se používají v těchto ukázkách.

Datová sada

V této ukázce se používá datová sada NYC Yellow Taxi . Soubory Parquet můžete dotazovat stejným způsobem jako soubory CSV. Jediným rozdílem je, že FILEFORMAT parametr by měl být nastaven na PARQUET. Příklady v tomto článku ukazují specifika čtení souborů Parquet.

Sada dotazů souborů parquet

Při dotazování na soubory Parquet můžete zadat pouze sloupce, které vás zajímají.

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;

Automatické odvození schématu

Při čtení souborů Parquet nemusíte používat klauzuli OPENROWSET WITH. Názvy sloupců a datové typy se automaticky čtou ze souborů Parquet.

Mějte na paměti, že pokud čtete počet souborů najednou, schéma, názvy sloupců a datové typy budou odvozeny z první souborové služby z úložiště. To může znamenat, že některé z očekávaných sloupců jsou vynechány, protože soubor používaný službou k definování schématu tyto sloupce neobsahoval. Pokud chcete explicitně zadat schéma, použijte klauzuli OPENROWSET WITH.

Následující ukázka ukazuje možnosti automatického odvozování schématu pro soubory Parquet. Vrátí počet řádků v září 2018 bez zadání schématu.

Poznámka:

Při čtení souborů Parquet nemusíte zadávat sloupce v klauzuli OPENROWSET WITH. V takovém případě bude bezserverová služba dotazů fondu SQL využívat metadata v souboru Parquet a svázat sloupce podle názvu.

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

Dotazování na dělená data

Datová sada poskytnutá v této ukázce je rozdělena (rozdělena) do samostatných podsložek. Konkrétní oddíly můžete cílit pomocí funkce filepath. Tento příklad ukazuje částky jízdného podle roku, měsíce a payment_type pro první tři měsíce roku 2017.

Poznámka:

Dotaz bezserverového fondu SQL je kompatibilní se schématem dělení 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;

Mapování typů

Mapování typů Parquet na mapování nativního typu SQL pro mapování typů Parquet

Další kroky

V dalším článku se dozvíte, jak dotazovat vnořené typy Parquet.