Abfragen von JSON-Dateien mit einem serverlosen SQL-Pool in Azure Synapse Analytics
In diesem Artikel erfahren Sie, wie Sie eine Abfrage mit einem serverlosen SQL-Pool in Azure Synapse Analytics schreiben können. Das Ziel der Abfrage ist das Lesen von JSON-Dateien mithilfe von OPENROWSET.
- JSON-Standarddateien, in denen mehrere JSON-Dokumente als JSON-Array gespeichert sind.
- Durch Zeilen getrennte JSON-Dateien, in denen JSON-Dokumente durch Zeilenumbruchzeichen getrennt sind. Gängige Erweiterungen für diese Dateitypen sind
jsonl
,ldjson
undndjson
.
Lesen von JSON-Dokumenten
Am einfachsten können Sie den Inhalt Ihrer JSON-Datei anzeigen, indem Sie der Funktion OPENROWSET
die Datei-URL bereitstellen, CSV als FORMAT
angeben und den Wert 0x0b
für fieldterminator
und fieldquote
festlegen. Wenn Sie durch Zeilen getrennte JSON-Dateien lesen müssen, ist dies ausreichend. Wenn Sie über eine klassische JSON-Datei verfügen, müssen Sie für rowterminator
den Wert 0x0b
festlegen. Die Funktion OPENROWSET
analysiert die JSON-Datei und gibt jedes Dokument im folgenden Format zurück:
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"} |
Wenn die Datei öffentlich verfügbar ist oder Ihre Microsoft Entra-Identität auf diese Datei zugreifen kann, sollten Sie den Inhalt der Datei mithilfe einer Abfrage wie im folgenden Beispiel anzeigen können.
Lesen von JSON-Dateien
Die folgende Beispielabfrage liest JSON- und durch Zeilen getrennte JSON-Dateien und gibt jedes Dokument als separate Zeile zurück.
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
Das JSON-Dokument in der obigen Beispielabfrage enthält ein Array von Objekten. Die Abfrage gibt jedes Objekt als separate Zeile im Resultset zurück. Stellen Sie sicher, dass Sie auf diese Datei zugreifen können. Wenn Ihre Datei mit einem SAS-Schlüssel oder einer benutzerdefinierten Identität geschützt ist, müssen Sie Anmeldeinformationen auf Serverebene für die SQL-Anmeldung einrichten.
Datenquellennutzung
Im vorherigen Beispiel wird der vollständige Pfad zur Datei verwendet. Alternativ können Sie eine externe Datenquelle mit dem Speicherort erstellen, der auf den Stammordner des Speichers verweist, und diese Datenquelle sowie den relativen Pfad zur Datei in der Funktion OPENROWSET
verwenden:
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
Wenn eine Datenquelle mit einem SAS-Schlüssel oder einer benutzerdefinierten Identität geschützt ist, können Sie die Datenquelle mit datenbankweit gültigen Anmeldeinformationen konfigurieren.
In den folgenden Abschnitten erfahren Sie, wie Sie verschiedene Typen von JSON-Dateien abfragen.
Analysieren von JSON-Dokumenten
Die Abfragen in den vorherigen Beispielen geben jedes JSON-Dokument als einzelne Zeichenfolge in einer separaten Zeile des Resultsets zurück. Mit den Funktionen JSON_VALUE
und OPENJSON
können Sie die Werte in JSON-Dokumenten analysieren und als relationale Werte zurückgeben, wie es im folgenden Beispiel gezeigt wird:
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 |
JSON-Beispieldokument
Die Abfragebeispiele lesen JSON-Dateien, die Dokumente mit der folgenden Struktur enthalten:
{
"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"
}
Hinweis
Wenn diese Dokumente als eine durch Trennzeichen getrennte JSON-Datei gespeichert werden, müssen Sie FIELDTERMINATOR
und FIELDQUOTE
auf „0x0b“ festlegen. Wenn Sie über ein JSON-Standardformat verfügen, müssen Sie ROWTERMINATOR
auf „0x0b“ festlegen.
Abfragen von JSON-Dateien mit JSON_VALUE
Die folgende Abfrage zeigt, wie Sie mithilfe von JSON_VALUE skalare Werte (date_rep
, countries_and_territories
, cases
) aus einem JSON-Dokument abrufen:
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
Nachdem Sie die JSON-Eigenschaften aus einem JSON-Dokument extrahiert haben, können Sie Spaltenaliase definieren und optional den Textwert in einen anderen Typ umwandeln.
Abfragen von JSON-Dateien mit OPENJSON
Die folgende Abfrage verwendet OPENJSON. Die in Serbien gemeldeten COVID-Statistiken werden abgerufen:
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;
Die Ergebnisse sind funktionsgleich mit den Ergebnissen, die von der JSON_VALUE
-Funktion zurückgegeben werden. In einigen Fällen kann OPENJSON
Vorteil gegenüber JSON_VALUE
bieten:
- In der
WITH
-Klausel können Sie die Spaltenaliase und die Typen für jede Eigenschaft explizit festlegen. Sie müssen dieCAST
-Funktion nicht in jeder Spalte derSELECT
-Liste einfügen. OPENJSON
ist möglicherweise schneller, wenn eine große Anzahl von Eigenschaften zurückgegeben wird. Wenn die Rückgabe nur ein oder zwei Eigenschaften umfasst, verursacht dieOPENJSON
-Funktion möglicherweise einen Overhead.- Um das Array aus jedem Dokument zu analysieren, müssen Sie die
OPENJSON
-Funktion verwenden und mit der übergeordneten Zeile verknüpfen.
Nächste Schritte
Die nächsten Artikel in dieser Reihe veranschaulichen Folgendes: