Dotazování souborů JSON 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 ve službě Azure Synapse Analytics. Cílem dotazu je čtení souborů JSON pomocí OPENROWSET.
- Standardní soubory JSON, ve kterých je uloženo více dokumentů JSON jako pole JSON.
- Soubory JSON s oddělovači řádků, ve kterých jsou dokumenty JSON oddělené znakem nového řádku. Běžné přípony pro tyto typy souborů jsou
jsonl
,ldjson
andjson
.
Čtení dokumentů JSON
Nejjednodušší způsob, jak zobrazit obsah souboru JSON, je zadat adresu URL souboru do OPENROWSET
funkce, zadat csv FORMAT
a nastavit hodnoty 0x0b
pro fieldterminator
a fieldquote
. Pokud potřebujete číst soubory JSON s oddělovači řádků, stačí to. Pokud máte klasický soubor JSON, budete muset nastavit hodnoty 0x0b
pro rowterminator
. OPENROWSET
funkce parsuje JSON a vrátí každý dokument v následujícím formátu:
Doc |
---|
{"date_rep":"2020-07-24","day":24,"month":7,"year":2020,"případy":3,"úmrtí":0,"geo_id":"AF"} |
{"date_rep":"2020-07-25","den":25;"měsíc":7,"rok":2020,"případy":7,"úmrtí":0,"geo_id":"AF"} |
{"date_rep":"2020-07-26","day":26,"month":7,"year":2020,"případy":4,"úmrtí":0,"geo_id":"AF"} |
{"date_rep":"2020-07-27","den":27;"měsíc":7,"rok":2020,"případy":8,"úmrtí":0,"geo_id":"AF"} |
Pokud je soubor veřejně dostupný nebo pokud má vaše identita Microsoft Entra přístup k tomuto souboru, měli byste vidět obsah souboru pomocí dotazu, jako je ten zobrazený v následujících příkladech.
Čtení souborů JSON
Následující ukázkový dotaz načte soubory JSON a soubory JSON s oddělovači řádků a vrátí každý dokument jako samostatný řádek.
select top 10 *
from openrowset(
bulk 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/ecdc_cases/latest/ecdc_cases.jsonl',
format = 'csv',
fieldterminator ='0x0b',
fieldquote = '0x0b'
) with (doc nvarchar(max)) as rows
go
select top 10 *
from openrowset(
bulk 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/ecdc_cases/latest/ecdc_cases.json',
format = 'csv',
fieldterminator ='0x0b',
fieldquote = '0x0b',
rowterminator = '0x0b' --> You need to override rowterminator to read classic JSON
) with (doc nvarchar(max)) as rows
Dokument JSON v předchozím ukázkovém dotazu obsahuje pole objektů. Dotaz vrátí každý objekt jako samostatný řádek v sadě výsledků. Ujistěte se, že máte přístup k tomuto souboru. Pokud je váš soubor chráněný klíčem SAS nebo vlastní identitou, budete muset pro přihlášení SQL nastavit přihlašovací údaje na úrovni serveru.
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.jsonl',
data_source = 'covid',
format = 'csv',
fieldterminator ='0x0b',
fieldquote = '0x0b'
) with (doc nvarchar(max)) as rows
go
select top 10 *
from openrowset(
bulk 'latest/ecdc_cases.json',
data_source = 'covid',
format = 'csv',
fieldterminator ='0x0b',
fieldquote = '0x0b',
rowterminator = '0x0b' --> You need to override rowterminator to read classic JSON
) with (doc nvarchar(max)) 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.
V následujících částech se dozvíte, jak dotazovat různé typy souborů JSON.
Parsování dokumentů JSON
Dotazy v předchozích příkladech vrátí každý dokument JSON jako jeden řetězec v samostatném řádku sady výsledků. Funkce JSON_VALUE
a OPENJSON
parsování hodnot v dokumentech JSON a jejich vrácení jako relačních hodnot, jak je znázorněno v následujícím příkladu:
date_rep | cases | geo_id |
---|---|---|
2020-07-24 | 3 | AF |
2020-07-25 | 7 | AF |
2020-07-26 | 4 | AF |
2020-07-27 | 8 | AF |
Ukázkový dokument JSON
Příklady dotazů čtou soubory JSON obsahující dokumenty s následující strukturou:
{
"date_rep":"2020-07-24",
"day":24,"month":7,"year":2020,
"cases":13,"deaths":0,
"countries_and_territories":"Afghanistan",
"geo_id":"AF",
"country_territory_code":"AFG",
"continent_exp":"Asia",
"load_date":"2020-07-25 00:05:14",
"iso_country":"AF"
}
Poznámka:
Pokud jsou tyto dokumenty uložené ve formátu JSON s oddělovači řádků, musíte nastavit FIELDTERMINATOR
a FIELDQUOTE
0x0b. Pokud máte standardní formát JSON, musíte nastavit ROWTERMINATOR
0x0b.
Dotazování souborů JSON pomocí JSON_VALUE
Následující dotaz ukazuje, jak pomocí JSON_VALUE načíst skalární hodnoty (date_rep
, countries_and_territories
, cases
) z dokumentů JSON:
select
JSON_VALUE(doc, '$.date_rep') AS date_reported,
JSON_VALUE(doc, '$.countries_and_territories') AS country,
CAST(JSON_VALUE(doc, '$.deaths') AS INT) as fatal,
JSON_VALUE(doc, '$.cases') as cases,
doc
from openrowset(
bulk 'latest/ecdc_cases.jsonl',
data_source = 'covid',
format = 'csv',
fieldterminator ='0x0b',
fieldquote = '0x0b'
) with (doc nvarchar(max)) as rows
order by JSON_VALUE(doc, '$.geo_id') desc
Jakmile extrahujete vlastnosti JSON z dokumentu JSON, můžete definovat aliasy sloupců a volitelně přetypovat textovou hodnotu na určitý typ.
Dotazování souborů JSON pomocí OPENJSON
Následující dotaz používá OPENJSON. Načte statistiky COVID hlášené v Srbsku:
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')
where country = 'Serbia'
order by country, date_rep desc;
Výsledky jsou funkčně stejné jako výsledky vrácené pomocí JSON_VALUE
funkce. V některých případech OPENJSON
můžou mít výhody:JSON_VALUE
- V klauzuli
WITH
můžete explicitně nastavit aliasy sloupců a typy pro každou vlastnost. Funkci nemusíte zadávatCAST
do všech sloupců vSELECT
seznamu. OPENJSON
může být rychlejší, pokud vracíte velký počet vlastností. Pokud vracíte pouze 1–2 vlastnosti,OPENJSON
může být tato funkce režijní náklady.- Funkci musíte použít
OPENJSON
, pokud potřebujete analyzovat pole z každého dokumentu a spojit ho s nadřazeným řádkem.
Další kroky
Další články v této sérii ukazují, jak: