Köra frågor mot JSON-filer med hjälp av en serverlös SQL-pool i Azure Synapse Analytics
I den här artikeln får du lära dig hur du skriver en fråga med hjälp av en serverlös SQL-pool i Azure Synapse Analytics. Frågans mål är att läsa JSON-filer med OPENROWSET.
- JSON-standardfiler där flera JSON-dokument lagras som en JSON-matris.
- Radavgränsade JSON-filer, där JSON-dokument avgränsas med nytt radtecken. Vanliga tillägg för dessa typer av filer är
jsonl
,ldjson
ochndjson
.
Läsa JSON-dokument
Det enklaste sättet att se innehållet i JSON-filen är att ange fil-URL:en till OPENROWSET
funktionen, ange csv FORMAT
och ange värden 0x0b
för fieldterminator
och fieldquote
. Om du behöver läsa radavgränsade JSON-filer räcker det. Om du har en klassisk JSON-fil måste du ange värden 0x0b
för rowterminator
. OPENROWSET
funktionen parsar JSON och returnerar varje dokument i följande format:
Doc |
---|
{"date_rep":"2020-07-24","day":24,"month":7,"year":2020,"cases":3,"deaths":0,"geo_id":"AF"} |
{"date_rep":"2020-07-25","day":25,"month":7,"year":2020,"cases":7,"deaths":0,"geo_id":"AF"} |
{"date_rep":"2020-07-26","day":26,"month":7,"year":2020,"cases":4,"deaths":0,"geo_id":"AF"} |
{"date_rep":"2020-07-27","day":27,"month":7,"year":2020,"cases":8,"deaths":0,"geo_id":"AF"} |
Om filen är offentligt tillgänglig, eller om din Microsoft Entra-identitet kan komma åt den här filen, bör du se innehållet i filen med hjälp av frågan som den som visas i följande exempel.
Läsa JSON-filer
Följande exempelfråga läser JSON- och radavgränsade JSON-filer och returnerar varje dokument som en separat rad.
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
JSON-dokumentet i föregående exempelfråga innehåller en matris med objekt. Frågan returnerar varje objekt som en separat rad i resultatuppsättningen. Kontrollera att du har åtkomst till den här filen. Om filen skyddas med SAS-nyckel eller anpassad identitet måste du konfigurera autentiseringsuppgifter på servernivå för sql-inloggning.
Användning av datakälla
I föregående exempel används en fullständig sökväg till filen. Alternativt kan du skapa en extern datakälla med den plats som pekar på lagringens rotmapp och använda den datakällan och den relativa sökvägen till filen i OPENROWSET
funktionen:
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
Om en datakälla skyddas med SAS-nyckel eller anpassad identitet kan du konfigurera datakällan med databasomfångsbegränsade autentiseringsuppgifter.
I följande avsnitt kan du se hur du kör frågor mot olika typer av JSON-filer.
Parsa JSON-dokument
Frågorna i föregående exempel returnerar varje JSON-dokument som en enskild sträng i en separat rad i resultatuppsättningen. Du kan använda funktioner JSON_VALUE
och OPENJSON
parsa värdena i JSON-dokument och returnera dem som relationsvärden, som det visas i följande exempel:
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 |
Exempel på JSON-dokument
Frågeexemplen läser json-filer som innehåller dokument med följande struktur:
{
"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"
}
Kommentar
Om dessa dokument lagras som radavgränsad JSON måste du ange FIELDTERMINATOR
och FIELDQUOTE
0x0b. Om du har ett JSON-standardformat måste du ange ROWTERMINATOR
till 0x0b.
Fråga JSON-filer med hjälp av JSON_VALUE
Frågan nedan visar hur du använder JSON_VALUE för att hämta skalärvärden (date_rep
, countries_and_territories
, cases
) från ett JSON-dokument:
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
När du har extraherat JSON-egenskaper från ett JSON-dokument kan du definiera kolumnalias och eventuellt omvandla textvärdet till någon typ.
Köra frågor mot JSON-filer med OPENJSON
Följande fråga använder OPENJSON. Den hämtar COVID-statistik som rapporteras i Serbien:
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;
Resultaten fungerar på samma sätt som de resultat som returneras med hjälp av JSON_VALUE
funktionen. I vissa fall OPENJSON
kan det ha en fördel jämfört JSON_VALUE
med :
WITH
I -satsen kan du uttryckligen ange kolumnalias och typerna för varje egenskap. Du behöver inte placeraCAST
funktionen i varje kolumn iSELECT
listan.OPENJSON
kan gå snabbare om du returnerar ett stort antal egenskaper. Om du bara returnerar 1–2 egenskaperOPENJSON
kan funktionen vara omkostnader.- Du måste använda
OPENJSON
funktionen om du behöver parsa matrisen från varje dokument och koppla den till den överordnade raden.
Nästa steg
Nästa artiklar i den här serien visar hur du: