Mata in JSON-formaterade exempeldata i Azure Data Explorer
Artikel
Den här artikeln visar hur du matar in JSON-formaterade data i en Azure Data Explorer-databas. Du börjar med enkla exempel på rå och mappad JSON, fortsätter till flerkantade JSON och tar sedan itu med mer komplexa JSON-scheman som innehåller matriser och ordlistor. Exemplen beskriver processen för att mata in JSON-formaterade data med hjälp av Kusto-frågespråk (KQL), C#eller Python.
Anteckning
Vi rekommenderar inte att du använder .ingest hanteringskommandon i produktionsscenarier. Använd i stället en dataanslutningsapp eller programmatiskt mata in data med något av Kusto-klientbiblioteken.
Förutsättningar
Ett Microsoft-konto eller en Microsoft Entra användaridentitet. En Azure-prenumeration krävs inte.
json: Radavgränsad JSON. Varje rad i indata har exakt en JSON-post. Det här formatet stöder parsning av kommentarer och egenskaper med enkla citattecken. Mer information finns i JSON-rader.
multijson: Flerfodrad JSON. Parsern ignorerar radavgränsarna och läser en post från den tidigare positionen till slutet av en giltig JSON.
Anteckning
När du matar in med hjälp av inmatningsguiden är multijsonstandardformatet . Formatet kan hantera flerrads-JSON-poster och matriser med JSON-poster. När ett parsningsfel påträffas ignoreras hela filen. Om du vill ignorera ogiltiga JSON-poster väljer du alternativet "Ignorera dataformatfel.", som växlar formatet till json (JSON-rader).
Om du använder JSON Line-formatet (json) hoppas rader som inte representerar giltiga JSON-poster över under parsningen.
Mata in och mappa JSON-formaterade data
Inmatning av JSON-formaterade data kräver att du anger formatet med hjälp av inmatningsegenskapen. Inmatning av JSON-data kräver mappning, som mappar en JSON-källpost till målkolumnen. När du matar in data använder du IngestionMapping egenskapen med dess ingestionMappingReference (för en fördefinierad mappning) inmatningsegenskap eller dess IngestionMappings egenskap. Den här artikeln använder inmatningsegenskapen ingestionMappingReference , som är fördefinierad i tabellen som används för inmatning. I exemplen nedan börjar vi med att mata in JSON-poster som rådata till en tabell med en kolumn. Sedan använder vi mappningen för att mata in varje egenskap till den mappade kolumnen.
Enkelt JSON-exempel
Följande exempel är en enkel JSON med en platt struktur. Data har information om temperatur och luftfuktighet som samlas in av flera enheter. Varje post markeras med ett ID och en tidsstämpel.
I det här exemplet matar du in JSON-poster som rådata till en tabell med en kolumn. Datamanipuleringen, med hjälp av frågor och uppdateringsprincipen görs när data har matats in.
Det här kommandot skapar en mappning och mappar JSON-rotsökvägen $ till Event kolumnen.
Mata in data i tabellen RawEvents .
.ingest into table RawEvents ('https://kustosamplefiles.blob.core.windows.net/jsonsamplefiles/simple.json') with '{"format":"json", "ingestionMappingReference":"RawEventMapping"}'
I den här mappningen, som definieras av tabellschemat, matas posterna timestamp in i kolumnen Time som datetime datatyper.
Mata in data i tabellen Events .
.ingest into table Events ('https://kustosamplefiles.blob.core.windows.net/jsonsamplefiles/simple.json') with '{"format":"json", "ingestionMappingReference":"FlatEventMapping"}'
Filen "simple.json" har några radavgränsade JSON-poster. Formatet är json, och mappningen som används i inmatningskommandot är den FlatEventMapping du skapade.
Skapa en ny tabell med ett liknande schema som JSON-indata. Vi använder den här tabellen för alla följande exempel och inmatningskommandon.
I den här mappningen, som definieras av tabellschemat, matas posterna timestamp in i kolumnen Time som datetime datatyper.
Mata in data i tabellen 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);
Filen "simple.json" har några radavgränsade JSON-poster. Formatet är json, och mappningen som används i inmatningskommandot är den FlatEventMapping du skapade.
Skapa en ny tabell med ett liknande schema som JSON-indata. Vi använder den här tabellen för alla följande exempel och inmatningskommandon.
Filen "simple.json" har några radavgränsade JSON-poster. Formatet är json, och mappningen som används i inmatningskommandot är den FlatEventMapping du skapade.
Mata in flerkantade JSON-poster
I det här exemplet matar du in flerfodrade JSON-poster. Varje JSON-egenskap mappas till en enda kolumn i tabellen. Filen "multilined.json" har några indragna JSON-poster. Formatet multijson anger att poster ska läsas av JSON-strukturen.
.ingest into table Events ('https://kustosamplefiles.blob.core.windows.net/jsonsamplefiles/multilined.json') with '{"format":"multijson", "ingestionMappingReference":"FlatEventMapping"}'
Mata in data i tabellen 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);
Matrisdatatyper är en ordnad samling värden. Inmatningen av en JSON-matris görs av en uppdateringsprincip. JSON matas in som den är till en mellanliggande tabell. En uppdateringsprincip kör en fördefinierad funktion i RawEvents tabellen och återesterar resultatet till måltabellen. Vi matar in data med följande struktur:
Skapa en update policy funktion som expanderar samlingen av records så att varje värde i samlingen får en separat rad med operatorn mv-expand . Vi använder tabellen RawEvents som en källtabell och Events som en måltabell.
.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"])
}
Schemat som tas emot av funktionen måste matcha schemat för måltabellen. Använd getschema operatorn för att granska schemat.
EventRecordsExpand() | getschema
Lägg till uppdateringsprincipen i måltabellen. Den här principen kör automatiskt frågan på nyligen inmatade data i den RawEvents mellanliggande tabellen och matar in resultatet i Events tabellen. Definiera en nollkvarhållningsprincip för att undvika att den mellanliggande tabellen bevaras.
.ingest into table RawEvents ('https://kustosamplefiles.blob.core.windows.net/jsonsamplefiles/array.json') with '{"format":"multijson", "ingestionMappingReference":"RawEventMapping"}'
Granska data i tabellen Events .
Events
Skapa en uppdateringsfunktion som expanderar samlingen av records så att varje värde i samlingen tar emot en separat rad med operatorn mv-expand . Vi använder tabellen RawEvents som en källtabell och Events som en måltabell.
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);
Anteckning
Schemat som tas emot av funktionen måste matcha schemat för måltabellen.
Lägg till uppdateringsprincipen i måltabellen. Den här principen kör automatiskt frågan på nyligen inmatade data i den RawEvents mellanliggande tabellen och matar in dess resultat i Events tabellen. Definiera en nollkvarhållningsprincip för att undvika att den mellanliggande tabellen bevaras.
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);
Granska data i tabellen Events .
Skapa en uppdateringsfunktion som expanderar samlingen av records så att varje värde i samlingen tar emot en separat rad med operatorn mv-expand . Vi använder tabellen RawEvents som en källtabell och Events som en måltabell.
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])
Anteckning
Schemat som tas emot av funktionen måste matcha schemat för måltabellen.
Lägg till uppdateringsprincipen i måltabellen. Den här principen kör automatiskt frågan på nyligen inmatade data i den RawEvents mellanliggande tabellen och matar in dess resultat i Events tabellen. Definiera en nollkvarhållningsprincip för att undvika att den mellanliggande tabellen bevaras.