JSON formátumú mintaadatok betöltése az Azure Data Explorer
Cikk
Ez a cikk bemutatja, hogyan lehet JSON formátumú adatokat beolvasni egy Azure Data Explorer-adatbázisba. Első lépésként egyszerű példákat fog találni a nyers és leképezett JSON-ra, továbblép a többsoros JSON-ra, majd összetettebb, tömböket és szótárakat tartalmazó JSON-sémákkal foglalkozik. A példák részletesen ismertetik a JSON formátumú adatok Kusto lekérdezésnyelv (KQL), C# vagy Python használatával történő betöltésének folyamatát.
Megjegyzés
Éles forgatókönyvekben nem javasoljuk a felügyeleti parancsok használatát .ingest . Ehelyett használjon adatösszekötőt , vagy programozott módon betöltse az adatokat a Kusto-ügyfélkódtárak egyikével.
Előfeltételek
Microsoft-fiók vagy Microsoft Entra felhasználói identitás. Nincs szükség Azure-előfizetésre.
Az Azure Data Explorer két JSON-fájlformátumot támogat:
json: Vonallal elválasztott JSON. A bemeneti adatok minden sora pontosan egy JSON-rekorddal rendelkezik. Ez a formátum támogatja a megjegyzések és az egy idézőjeles tulajdonságok elemzését. További információ: JSON Lines.
multijson: Többsoros JSON. Az elemző figyelmen kívül hagyja a sorelválasztókat, és beolvas egy rekordot az előző pozíciótól az érvényes JSON végéig.
Megjegyzés
A betöltési varázslóval történő betöltéskor az alapértelmezett formátum a multijson. A formátum képes többsoros JSON-rekordok és JSON-rekordok tömbjeinek kezelésére. Elemzési hiba esetén a teljes fájl el lesz vetve. Az érvénytelen JSON-rekordok figyelmen kívül hagyásához válassza az "Adatformátum-hibák figyelmen kívül hagyása" lehetőséget, amely a formátumot (JSON-sorok) értékre json váltja.
Ha JSON-sorformátumot (json) használ, az elemzés során a nem érvényes JSON-rekordokat nem képviselő vonalak kimaradnak.
JSON formátumú adatok betöltése és leképezése
A JSON formátumú adatok betöltéséhez meg kell adnia a formátumot a betöltési tulajdonság használatával. A JSON-adatok betöltéséhez leképezésre van szükség, amely leképez egy JSON-forrásbejegyzést a céloszlopra. Adatok betöltésekor használja a tulajdonságot annak IngestionMappingingestionMappingReference (előre meghatározott leképezéshez) betöltési tulajdonságával vagy tulajdonságával IngestionMappings . Ez a cikk a ingestionMappingReference betöltéshez használt táblában előre definiált betöltési tulajdonságot fogja használni. Az alábbi példákban a JSON-rekordok nyers adatként való betöltésével kezdjük egy oszloptáblába. Ezután a leképezés használatával betöltjük az egyes tulajdonságokat a leképezett oszlopba.
Egyszerű JSON-példa
Az alábbi példa egy egyszerű JSON, lapos szerkezettel. Az adatok hőmérsékletre és páratartalomra vonatkozó információkat tartalmaznak, amelyeket több eszköz gyűjtött össze. Minden rekord azonosítóval és időbélyeggel van megjelölve.
Ebben a példában a JSON-rekordokat nyers adatként kell feldolgozni egyetlen oszloptáblába. Az adatok kezelése, a lekérdezések használata és a frissítési szabályzat az adatok betöltése után történik.
A Fürt hozzáadása párbeszédpanelen adja meg a fürt URL-címét az űrlapon https://<ClusterName>.<Region>.kusto.windows.net/, majd válassza a Hozzáadás lehetőséget.
Illessze be a következő parancsot, és válassza a Futtatás lehetőséget a tábla létrehozásához.
.create table RawEvents (Event: dynamic)
Ez a lekérdezés egy dinamikus adattípusú Event egyetlen oszloppal rendelkező táblát hoz létre.
Ez a parancs létrehoz egy leképezést, és leképezi a JSON gyökérútvonalát $ az Event oszlopra.
Adatok betöltése a RawEvents táblába.
.ingest into table RawEvents ('https://kustosamplefiles.blob.core.windows.net/jsonsamplefiles/simple.json') with '{"format":"json", "ingestionMappingReference":"RawEventMapping"}'
Ebben a leképezésben a táblaséma által meghatározott módon a timestamp bejegyzések adattípusként datetime lesznek betöltve az oszlopbaTime.
Adatok betöltése a Events táblába.
.ingest into table Events ('https://kustosamplefiles.blob.core.windows.net/jsonsamplefiles/simple.json') with '{"format":"json", "ingestionMappingReference":"FlatEventMapping"}'
A "simple.json" fájl néhány sorra tagolt JSON-rekordot használ. A formátum a , jsonés a betöltési parancsban használt leképezés az FlatEventMapping Ön által létrehozott.
Hozzon létre egy új táblát a JSON bemeneti adataihoz hasonló sémával. Ezt a táblázatot az alábbi példákhoz és betöltési parancsokhoz fogjuk használni.
Ebben a leképezésben a táblaséma által meghatározott módon a timestamp bejegyzések adattípusként datetime lesznek betöltve az oszlopbaTime.
Adatok betöltése a Events táblába.
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);
A "simple.json" fájl néhány sorra tagolt JSON-rekordot használ. A formátum a , jsonés a betöltési parancsban használt leképezés az FlatEventMapping Ön által létrehozott.
Hozzon létre egy új táblát a JSON bemeneti adataihoz hasonló sémával. Ezt a táblázatot az alábbi példákhoz és betöltési parancsokhoz fogjuk használni.
A "simple.json" fájl néhány sorra tagolt JSON-rekordokkal rendelkezik. A formátum a , jsonés a betöltési parancsban használt leképezés az FlatEventMapping Ön által létrehozott.
Többsoros JSON-rekordok betöltése
Ebben a példában többsoros JSON-rekordokat fog beszedni. Minden JSON-tulajdonság a tábla egyetlen oszlopára van leképezve. A multilined.json fájlban néhány behúzott JSON-rekord található. A formátum multijson azt jelzi, hogy a rekordok JSON-struktúra szerint vannak beolvasva.
.ingest into table Events ('https://kustosamplefiles.blob.core.windows.net/jsonsamplefiles/multilined.json') with '{"format":"multijson", "ingestionMappingReference":"FlatEventMapping"}'
Adatok betöltése a Events táblába.
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);
A tömb adattípusok értékek rendezett gyűjteményei. A JSON-tömbök betöltése frissítési szabályzattal történik. A JSON egy köztes táblába van betöltve. A frissítési szabályzat egy előre definiált függvényt futtat a RawEvents táblán, és az eredményeket a céltáblába betölti. Az adatokat a következő struktúrával fogjuk betölteni:
Hozzon létre egy függvényt update policy , amely kibontja a gyűjteményét records , hogy a gyűjtemény minden értéke külön sort kapjon az mv-expand operátor használatával. A táblát RawEvents forrástáblaként és Events céltáblaként fogjuk használni.
.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"])
}
A függvény által fogadott sémának meg kell egyeznie a céltábla sémájának. A séma áttekintéséhez használja getschema az operátort.
EventRecordsExpand() | getschema
Adja hozzá a frissítési szabályzatot a céltáblához. Ez a szabályzat automatikusan futtatja a lekérdezést a köztes táblában RawEvents újonnan betöltött adatokon, és betölti az eredményeket a Events táblába. Adjon meg egy zéró adatmegőrzési szabályzatot a köztes tábla megőrzésének elkerülése érdekében.
.ingest into table RawEvents ('https://kustosamplefiles.blob.core.windows.net/jsonsamplefiles/array.json') with '{"format":"multijson", "ingestionMappingReference":"RawEventMapping"}'
Tekintse át a Events táblázatban szereplő adatokat.
Events
Hozzon létre egy frissítési függvényt, amely kibontja a gyűjteményét records , hogy a gyűjtemény minden egyes értéke külön sort kapjon az mv-expand operátor használatával. A táblát RawEvents forrástáblaként és Events céltáblaként fogjuk használni.
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);
Megjegyzés
A függvény által fogadott sémának meg kell egyeznie a céltábla sémájának.
Adja hozzá a frissítési szabályzatot a céltáblához. Ez a szabályzat automatikusan futtatja a lekérdezést a köztes táblában RawEvents újonnan betöltött adatokon, és betölti az eredményeket a Events táblába. Adjon meg egy zéró adatmegőrzési szabályzatot a köztes tábla megőrzésének elkerülése érdekében.
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);
Tekintse át a Events táblázatban szereplő adatokat.
Hozzon létre egy frissítési függvényt, amely kibontja a gyűjteményét records , hogy a gyűjtemény minden egyes értéke külön sort kapjon az mv-expand operátor használatával. A táblát RawEvents forrástáblaként és Events céltáblaként fogjuk használni.
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])
Megjegyzés
A függvény által fogadott sémának meg kell egyeznie a céltábla sémájának.
Adja hozzá a frissítési szabályzatot a céltáblához. Ez a szabályzat automatikusan futtatja a lekérdezést a köztes táblában RawEvents újonnan betöltött adatokon, és betölti az eredményeket a Events táblába. Adjon meg egy zéró adatmegőrzési szabályzatot a köztes tábla megőrzésének elkerülése érdekében.