Query's uitvoeren op JSON-bestanden met behulp van een serverloze SQL-pool in Azure Synapse Analytics
In dit artikel leert u hoe u een query schrijft met behulp van een serverloze SQL-pool in Azure Synapse Analytics. Het doel van de query is om JSON-bestanden te lezen met behulp van OPENROWSET.
- Standaard JSON-bestanden waarin meerdere JSON-documenten worden opgeslagen als een JSON-matrix.
- Met regels gescheiden JSON-bestanden, waarbij JSON-documenten worden gescheiden door een nieuw regelteken. Algemene extensies voor deze typen bestanden zijn
jsonl
,ldjson
enndjson
.
JSON-documenten lezen
De eenvoudigste manier om de inhoud van uw JSON-bestand te bekijken, is door de bestands-URL naar de OPENROWSET
functie op te geven, CSV FORMAT
op te geven en waarden 0x0b
in te stellen voor fieldterminator
en fieldquote
. Als u JSON-bestanden met regelscheidingstekens moet lezen, is dit voldoende. Als u een klassiek JSON-bestand hebt, moet u waarden 0x0b
instellen voor rowterminator
. OPENROWSET
de functie parseert JSON en retourneert elk document in de volgende indeling:
Doc |
---|
{"date_rep":"2020-07-24","day":24,"month":7,"year":2020,"cases":3,"dood":0,"geo_id":"AF"} |
{"date_rep":"2020-07-25","day":25,"month":7,"year":2020,"cases":7,"dood":0,"geo_id":"AF"} |
{"date_rep":"2020-07-26","day":26,"month":7,"year":2020,"cases":4,"dood":0,"geo_id":"AF"} |
{"date_rep":"2020-07-27","day":27,"month":7,"year":2020,"cases":8,"dood":0,"geo_id":"AF"} |
Als het bestand openbaar beschikbaar is of als uw Microsoft Entra-identiteit toegang heeft tot dit bestand, ziet u de inhoud van het bestand met behulp van de query, zoals in de volgende voorbeelden.
JSON-bestanden lezen
De volgende voorbeeldquery leest JSON- en met regels gescheiden JSON-bestanden en retourneert elk document als een afzonderlijke rij.
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
Het JSON-document in de voorgaande voorbeeldquery bevat een matrix met objecten. De query retourneert elk object als een afzonderlijke rij in de resultatenset. Zorg ervoor dat u toegang hebt tot dit bestand. Als uw bestand is beveiligd met een SAS-sleutel of aangepaste identiteit, moet u referenties op serverniveau instellen voor sql-aanmelding.
Gebruik van gegevensbronnen
In het vorige voorbeeld wordt het volledige pad naar het bestand gebruikt. Als alternatief kunt u een externe gegevensbron maken met de locatie die verwijst naar de hoofdmap van de opslag en die gegevensbron en het relatieve pad naar het bestand in de OPENROWSET
functie gebruiken:
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
Als een gegevensbron is beveiligd met een SAS-sleutel of een aangepaste identiteit, kunt u de gegevensbron configureren met referenties binnen het databasebereik.
In de volgende secties ziet u hoe u query's kunt uitvoeren op verschillende typen JSON-bestanden.
JSON-documenten parseren
De query's in de vorige voorbeelden retourneren elk JSON-document als één tekenreeks in een afzonderlijke rij van de resultatenset. U kunt functies JSON_VALUE
gebruiken en OPENJSON
de waarden parseren in JSON-documenten en deze retourneren als relationele waarden, zoals wordt weergegeven in het volgende voorbeeld:
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 |
Voorbeeld van JSON-document
In de queryvoorbeelden worden json-bestanden met documenten met de volgende structuur gelezen:
{
"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"
}
Notitie
Als deze documenten zijn opgeslagen als met regels gescheiden JSON, moet u instellen FIELDTERMINATOR
en FIELDQUOTE
0x0b. Als u een standaard JSON-indeling hebt, moet u instellen ROWTERMINATOR
op 0x0b.
Query's uitvoeren op JSON-bestanden met behulp van JSON_VALUE
In de onderstaande query ziet u hoe u JSON_VALUE kunt gebruiken om scalaire waarden (date_rep
, countries_and_territories
, cases
) op te halen uit JSON-documenten:
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
Zodra u JSON-eigenschappen uit een JSON-document hebt geëxtraheerd, kunt u kolomaliassen definiëren en desgewenst de tekstwaarde naar een bepaald type casten.
Query's uitvoeren op JSON-bestanden met OPENJSON
De volgende query maakt gebruik van OPENJSON. Het haalt COVID-statistieken op die in Servië zijn gerapporteerd:
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;
De resultaten zijn functioneel hetzelfde als de resultaten die worden geretourneerd met behulp van de JSON_VALUE
functie. In sommige gevallen kan OPENJSON
dit voordeel hebben ten opzichte van JSON_VALUE
:
- In de
WITH
component kunt u expliciet de kolomaliassen en de typen voor elke eigenschap instellen. U hoeft deCAST
functie niet in elke kolom inSELECT
de lijst te plaatsen. OPENJSON
kan sneller zijn als u een groot aantal eigenschappen retourneert. Als u slechts 1-2 eigenschappen retourneert, is deOPENJSON
functie mogelijk overhead.- U moet de
OPENJSON
functie gebruiken als u de matrix uit elk document wilt parseren en deze wilt samenvoegen met de bovenliggende rij.
Volgende stappen
In de volgende artikelen in deze reeks ziet u hoe u het volgende kunt doen: