Erfassen von Beispieldaten im JSON-Format in Azure Data Explorer
Artikel
In diesem Artikel wird das Erfassen von Daten im JSON-Format in einer Azure Data Explorer-Datenbank veranschaulicht. Sie beginnen mit einfachen Beispielen für unformatierten und zugeordneten JSON-Code, fahren dann mit mehrzeiligem JSON-Code fort und beschäftigen sich schließlich mit komplexeren JSON-Schemas, die Arrays und Wörterbücher enthalten. Die Beispiele beschreiben den Prozess der Erfassung von JSON-formatierten Daten mithilfe von Kusto-Abfragesprache (KQL), C# oder Python.
Hinweis
Die Verwendung von .ingest Verwaltungsbefehlen in Produktionsszenarien wird nicht empfohlen. Verwenden Sie stattdessen einen Datenconnector , oder erfassen Sie Daten programmgesteuert mithilfe einer der Kusto-Clientbibliotheken.
Voraussetzungen
Ein Microsoft-Konto oder eine Microsoft Entra Benutzeridentität. Ein Azure-Abonnement ist nicht erforderlich.
Azure Data Explorer unterstützt zwei JSON-Dateiformate:
json: JSON-Code mit Trennung nach Zeilen. Jede Zeile in den Eingabedaten enthält exakt einen JSON-Datensatz. Dieses Format unterstützt die Analyse von Kommentaren und Eigenschaften mit einzeler Anführungszeichen. Weitere Informationen finden Sie unter JSON Lines.
multijson: Mehrzeiliger JSON-Code. Der Parser ignoriert die Zeilentrennungen und liest einen Datensatz von der vorherigen Position bis zum Ende eines gültigen JSON-Codes.
Hinweis
Bei der Erfassung mithilfe des Erfassungs-Assistenten ist multijsondas Standardformat . Das Format kann mehrlineige JSON-Datensätze und Arrays von JSON-Datensätzen verarbeiten. Wenn ein Analysefehler auftritt, wird die gesamte Datei verworfen. Um ungültige JSON-Einträge zu ignorieren, wählen Sie die Option "Datenformatfehler ignorieren" aus, wodurch das Format in json (JSON-Zeilen) geändert wird.
Wenn Sie das JSON-Zeilenformat (json) verwenden, werden Zeilen, die keine gültigen JSON-Einträge darstellen, während der Analyse übersprungen.
Erfassen und Zuordnen von Daten im JSON-Format
Für die Erfassung von Daten im JSON-Format müssen Sie das Format angeben, indem Sie die Erfassungseigenschaft verwenden. Für die Erfassung von JSON-Daten ist eine Zuordnung erforderlich, bei der ein JSON-Quelleintrag der Zielspalte zugeordnet wird. Verwenden Sie bei der Datenerfassung die Eigenschaft IngestionMapping mit der Erfassungseigenschaft ingestionMappingReference (für eine vordefinierte Zuordnung) oder mit der Eigenschaft IngestionMappings. In diesem Artikel wird die ingestionMappingReference-Erfassungseigenschaft verwendet, die in der für die Erfassung verwendeten Tabelle vordefiniert ist. In den folgenden Beispielen erfassen wir zunächst JSON-Datensätze als Rohdaten in einer einzelnen Tabellenspalte. Anschließend verwenden wir die Zuordnung, um jede Eigenschaft in ihrer zugeordneten Spalte zu erfassen.
Einfaches JSON-Beispiel
Das folgende Beispiel zeigt einfachen JSON-Code mit einer flachen Struktur. Die Daten enthalten Informationen zur Temperatur und Luftfeuchtigkeit, die von mehreren Geräten gesammelt werden. Jeder Datensatz ist mit einer ID und einem Zeitstempel gekennzeichnet.
In diesem Beispiel erfassen Sie JSON-Datensätze als Rohdaten in einer Tabelle mit nur einer Spalte. Vorgänge wie die Datenbearbeitung, Verwendung von Abfragen und Aktualisierung von Richtlinien werden nach dem Erfassen der Daten durchgeführt.
Geben Sie im Dialogfeld Add cluster (Cluster hinzufügen) Ihre Cluster-URL im Format https://<ClusterName>.<Region>.kusto.windows.net/ ein, und wählen Sie dann Hinzufügen aus.
Fügen Sie den folgenden Befehl ein, und wählen Sie Ausführen aus, um die Tabelle zu erstellen.
.create table RawEvents (Event: dynamic)
Mit dieser Abfrage wird eine Tabelle mit nur einer Event-Spalte und dem Datentyp Dynamisch erstellt.
Mit diesem Befehl wird eine Zuordnung erstellt und der JSON-Stammpfad $ der Spalte Event zugeordnet.
Erfassen Sie Daten in der Tabelle RawEvents.
.ingest into table RawEvents ('https://kustosamplefiles.blob.core.windows.net/jsonsamplefiles/simple.json') with '{"format":"json", "ingestionMappingReference":"RawEventMapping"}'
Verwenden Sie C#, um Daten im JSON-Rohformat zu erfassen.
Erstellen Sie die Tabelle RawEvents.
var kustoUri = "https://<clusterName>.<region>.kusto.windows.net/";
var connectionStringBuilder = new KustoConnectionStringBuilder(kustoUri)
{
FederatedSecurity = true,
UserID = userId,
Password = password,
Authority = tenantId,
InitialCatalog = databaseName
};
using var kustoClient = KustoClientFactory.CreateCslAdminProvider(connectionStringBuilder);
var tableName = "RawEvents";
var command = CslCommandGenerator.GenerateTableCreateCommand(
tableName,
new[] { Tuple.Create("Events", "System.Object") }
);
await kustoClient.ExecuteControlCommandAsync(command);
Erstellen Sie eine neue Tabelle mit einem ähnlichen Schema wie für die JSON-Eingabedaten. Wir verwenden diese Tabelle für alle folgenden Beispiele und Erfassungsbefehle.
In dieser Zuordnung werden die timestamp-Einträge – wie im Tabellenschema definiert – in der Spalte Time mit dem Datentyp datetime erfasst.
Erfassen Sie Daten in der Tabelle Events.
.ingest into table Events ('https://kustosamplefiles.blob.core.windows.net/jsonsamplefiles/simple.json') with '{"format":"json", "ingestionMappingReference":"FlatEventMapping"}'
Die Datei „simple.json“ enthält einige JSON-Datensätze, die nach Zeilen getrennt sind. Das Format lautet json, und im Erfassungsbefehl wird das von Ihnen erstellte FlatEventMapping-Element für die Zuordnung genutzt.
Erstellen Sie eine neue Tabelle mit einem ähnlichen Schema wie für die JSON-Eingabedaten. Wir verwenden diese Tabelle für alle folgenden Beispiele und Erfassungsbefehle.
In dieser Zuordnung werden die timestamp-Einträge – wie im Tabellenschema definiert – in der Spalte Time mit dem Datentyp datetime erfasst.
Erfassen Sie Daten in der Tabelle Events.
var blobPath = "https://kustosamplefiles.blob.core.windows.net/jsonsamplefiles/simple.json";
var properties = new KustoQueuedIngestionProperties(databaseName, tableName)
{
Format = DataSourceFormat.json,
IngestionMapping = new IngestionMapping { IngestionMappingReference = tableMappingName }
};
await ingestClient.IngestFromStorageAsync(blobPath, properties).ConfigureAwait(false);
Die Datei „simple.json“ enthält einige JSON-Datensätze, die nach Zeilen getrennt sind. Das Format lautet json, und im Erfassungsbefehl wird das von Ihnen erstellte FlatEventMapping-Element für die Zuordnung genutzt.
Erstellen Sie eine neue Tabelle mit einem ähnlichen Schema wie für die JSON-Eingabedaten. Wir verwenden diese Tabelle für alle folgenden Beispiele und Erfassungsbefehle.
Die Datei „simple.json“ enthält einige JSON-Datensätze, die nach Zeilen getrennt sind. Das Format lautet json, und im Erfassungsbefehl wird das von Ihnen erstellte FlatEventMapping-Element für die Zuordnung genutzt.
Erfassen von mehrzeiligen JSON-Datensätzen
In diesem Beispiel erfassen Sie mehrzeilige JSON-Datensätze. Jede JSON-Eigenschaft wird einer Spalte der Tabelle zugeordnet. Die Datei „multilined.json“ enthält einige eingezogene JSON-Datensätze. Das Format multijson gibt an, Datensätze nach der JSON-Struktur zu lesen.
.ingest into table Events ('https://kustosamplefiles.blob.core.windows.net/jsonsamplefiles/multilined.json') with '{"format":"multijson", "ingestionMappingReference":"FlatEventMapping"}'
Erfassen Sie Daten in der Tabelle Events.
var tableMappingName = "FlatEventMapping";
var blobPath = "https://kustosamplefiles.blob.core.windows.net/jsonsamplefiles/multilined.json";
var properties = new KustoQueuedIngestionProperties(databaseName, tableName)
{
Format = DataSourceFormat.multijson,
IngestionMapping = new IngestionMapping { IngestionMappingReference = tableMappingName }
};
await ingestClient.IngestFromStorageAsync(blobPath, properties).ConfigureAwait(false);
Arraydatentypen sind eine geordnete Sammlung von Werten. Die Erfassung eines JSON-Arrays erfolgt über eine Updaterichtlinie. Der JSON-Code wird ohne Änderungen in einer Zwischentabelle erfasst. Bei allen Updaterichtlinien wird für die Tabelle RawEvents eine vordefinierte Funktion ausgeführt, und die Ergebnisse werden wieder in der Zieltabelle erfasst. Wir erfassen Daten mit der folgenden Struktur:
Erstellen Sie eine update policy-Funktion, mit der die Sammlung von records so erweitert wird, dass jeder Wert der Sammlung über den Operator mv-expand in einer separaten Zeile angeordnet wird. Wir nutzen die Tabelle RawEvents als Quelltabelle und Events als Zieltabelle.
.create function EventRecordsExpand() {
RawEvents
| mv-expand records = Event.records
| project
Time = todatetime(records["timestamp"]),
Device = tostring(records["deviceId"]),
MessageId = tostring(records["messageId"]),
Temperature = todouble(records["temperature"]),
Humidity = todouble(records["humidity"])
}
Das von der Funktion empfangene Schema muss mit dem Schema der Zieltabelle übereinstimmen. Verwenden Sie den Operator getschema, um das Schema zu überprüfen.
EventRecordsExpand() | getschema
Fügen Sie die Updaterichtlinie der Zieltabelle hinzu. Diese Richtlinie führt die Abfrage automatisch für alle neu erfassten Daten in der Zwischentabelle RawEvents aus und erfasst die Ergebnisse in der Tabelle Events. Definieren Sie eine Richtlinie mit einem Aufbewahrungszeitraum von Null, um das beständige Speichern der Zwischentabelle zu vermeiden.
.ingest into table RawEvents ('https://kustosamplefiles.blob.core.windows.net/jsonsamplefiles/array.json') with '{"format":"multijson", "ingestionMappingReference":"RawEventMapping"}'
Sehen Sie sich die Daten in der Tabelle Events an.
Events
Erstellen Sie eine Updatefunktion, mit der die Sammlung von records so erweitert wird, dass jeder Wert der Sammlung über den Operator mv-expand in einer separaten Zeile angeordnet wird. Wir nutzen die Tabelle RawEvents als Quelltabelle und Events als Zieltabelle.
var command = CslCommandGenerator.GenerateCreateFunctionCommand(
"EventRecordsExpand",
"UpdateFunctions",
string.Empty,
null,
@"RawEvents
| mv-expand records = Event
| project
Time = todatetime(records['timestamp']),
Device = tostring(records['deviceId']),
MessageId = tostring(records['messageId']),
Temperature = todouble(records['temperature']),
Humidity = todouble(records['humidity'])",
ifNotExists: false
);
await kustoClient.ExecuteControlCommandAsync(command);
Hinweis
Das von der Funktion empfangene Schema muss mit dem Schema der Zieltabelle übereinstimmen.
Fügen Sie die Updaterichtlinie der Zieltabelle hinzu. Diese Richtlinie führt die Abfrage automatisch für alle neu erfassten Daten in der Zwischentabelle RawEvents aus und erfasst die Ergebnisse in der Tabelle Events. Definieren Sie eine Richtlinie mit einem Aufbewahrungszeitraum von Null, um das beständige Speichern der Zwischentabelle zu vermeiden.
var blobPath = "https://kustosamplefiles.blob.core.windows.net/jsonsamplefiles/array.json";
var tableName = "RawEvents";
var tableMappingName = "RawEventMapping";
var properties = new KustoQueuedIngestionProperties(databaseName, tableName)
{
Format = DataSourceFormat.multijson,
IngestionMapping = new IngestionMapping { IngestionMappingReference = tableMappingName }
};
await ingestClient.IngestFromStorageAsync(blobPath, properties);
Sehen Sie sich die Daten in der Tabelle Events an.
Erstellen Sie eine Updatefunktion, mit der die Sammlung von records so erweitert wird, dass jeder Wert der Sammlung über den Operator mv-expand in einer separaten Zeile angeordnet wird. Wir nutzen die Tabelle RawEvents als Quelltabelle und Events als Zieltabelle.
CREATE_FUNCTION_COMMAND =
'''.create function EventRecordsExpand() {
RawEvents
| mv-expand records = Event
| project
Time = todatetime(records["timestamp"]),
Device = tostring(records["deviceId"]),
MessageId = tostring(records["messageId"]),
Temperature = todouble(records["temperature"]),
Humidity = todouble(records["humidity"])
}'''
RESPONSE = KUSTO_CLIENT.execute_mgmt(DATABASE, CREATE_FUNCTION_COMMAND)
dataframe_from_result_table(RESPONSE.primary_results[0])
Hinweis
Das von der Funktion empfangene Schema muss mit dem Schema der Zieltabelle übereinstimmen.
Fügen Sie die Updaterichtlinie der Zieltabelle hinzu. Diese Richtlinie führt die Abfrage automatisch für alle neu erfassten Daten in der Zwischentabelle RawEvents aus und erfasst die Ergebnisse in der Tabelle Events. Definieren Sie eine Richtlinie mit einem Aufbewahrungszeitraum von Null, um das beständige Speichern der Zwischentabelle zu vermeiden.