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 vyšší zvýšení výkonu oproti ostatním kolací. 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 nebo segment sloupců). Pokud použijete jiné 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 explicitně zadáváte určitou kolaci UTF-8 (například Latin1_General_100_BIN2_UTF8
) pro všechny řetězcové sloupce v WITH
klauzuli nebo nastavte 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ů sloupců, 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.
Požadavky
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 se odvozují 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 neobsahuje. 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