Dela via


Mata in data med hjälp av Azure Data Explorer Node-biblioteket

Azure Data Explorer är en snabb och mycket skalbar datautforskningstjänst för logg- och telemetridata. Azure Data Explorer innehåller två klientbibliotek för Node: ett inmatningsbibliotek och ett databibliotek. Med de här biblioteken kan du mata in (läsa in) data i ett kluster och köra frågor mot data från koden. I den här artikeln skapar du först en tabell och datamappning i ett testkluster. Sedan köar du inmatning till klustret och validerar resultatet.

Om du inte har en Azure-prenumeration kan du skapa ett kostnadsfritt Azure-konto innan du börjar.

Förutsättningar

  • Ett Microsoft-konto eller en Microsoft Entra-användaridentitet. En Azure-prenumeration krävs inte.
  • Ett Azure Data Explorer-kluster och en databas. Skapa ett kluster och en databas.
  • Node.js installerat på utvecklingsdatorn

Installera data och mata in bibliotek

Installera azure-kusto-ingest och azure-kusto-data

npm i azure-kusto-ingest@^3.3.2 azure-kusto-data@^3.3.2

Lägg till importsatser och konstanter

Importera klasser från biblioteken


const { Client: KustoClient, KustoConnectionStringBuilder } =  require('azure-kusto-data');
const {
    IngestClient: KustoIngestClient,
    IngestionProperties,
    IngestionDescriptors,
    DataFormat,
    IngestionMappingKind,
} =  require("azure-kusto-ingest");

För att autentisera ett program använder Azure Data Explorer ditt Klient-ID för Microsoft Entra. För att hitta ditt tenant-ID följer du anvisningarna i Hitta ditt tenant-ID för Microsoft 365.

Ange värdena för authorityId, kustoUrikustoIngestUri och kustoDatabase innan du kör den här koden.

const cluster = "MyCluster";
const region = "westus";
const authorityId = "microsoft.com";
const kustoUri = `https://${cluster}.${region}.kusto.windows.net`;
const kustoIngestUri = `https://ingest-${cluster}.${region}.kusto.windows.net`;
const kustoDatabase  = "Weather";

Konstruera nu anslutningssträngen. I det här exemplet används enhetsautentisering för att komma åt klustret. Kontrollera konsolens utdata för att slutföra autentiseringen. Du kan också använda ett Microsoft Entra-programcertifikat, en programnyckel samt användare och lösenord.

Du skapar måltabellen och mappningen i ett senare steg.

const kcsbIngest = KustoConnectionStringBuilder.withAadDeviceAuthentication(kustoIngestUri, authorityId);
const kcsbData = KustoConnectionStringBuilder.withAadDeviceAuthentication(kustoUri, authorityId);
const destTable = "StormEvents";
const destTableMapping = "StormEvents_CSV_Mapping";

Ange källfilinformation

Importera fler klasser och ange konstanter för datakällans fil. I det här exemplet används en exempelfil som finns på Azure Blob Storage. StormEvents-exempeldatamängden innehåller väderrelaterade data från National Centers for Environmental Information.

const container = "samplefiles";
const account = "kustosamples";
const sas = "";  // If relevant add SAS token
const filePath = "StormEvents.csv";
const blobPath = `https://${account}.blob.core.windows.net/${container}/${filePath}${sas}`;

Skapa en tabell i ditt testkluster

Skapa en tabell som matchar schemat för data i StormEvents.csv filen. När den här koden körs returneras ett meddelande som liknar följande: Om du vill logga in använder du en webbläsare för att öppna sidan https://microsoft.com/devicelogin och anger koden XXXXXXXXX för att autentisera. Följ stegen för att logga in och gå sedan tillbaka för att köra nästa kodblock. Efterföljande kodblock som upprättar en anslutning kräver att du loggar in igen.

const kustoClient = new KustoClient(kcsbData);
const createTableCommand = `.create table ${destTable} (StartTime: datetime, EndTime: datetime, EpisodeId: int, EventId: int, State: string, EventType: string, InjuriesDirect: int, InjuriesIndirect: int, DeathsDirect: int, DeathsIndirect: int, DamageProperty: int, DamageCrops: int, Source: string, BeginLocation: string, EndLocation: string, BeginLat: real, BeginLon: real, EndLat: real, EndLon: real, EpisodeNarrative: string, EventNarrative: string, StormSummary: dynamic)`;

const createTableResults = await kustoClient.executeMgmt(kustoDatabase, createTableCommand);
console.log(createTableResults.primaryResults[0].toJSON().data);

Definiera mappning för datainmatning

Mappa inkommande CSV-data till kolumnnamnen och datatyperna som används när du skapar tabellen.

const createMappingCommand = `.create table ${destTable} ingestion csv mapping '${destTableMapping}' '[{"Name":"StartTime","datatype":"datetime","Ordinal":0}, {"Name":"EndTime","datatype":"datetime","Ordinal":1},{"Name":"EpisodeId","datatype":"int","Ordinal":2},{"Name":"EventId","datatype":"int","Ordinal":3},{"Name":"State","datatype":"string","Ordinal":4},{"Name":"EventType","datatype":"string","Ordinal":5},{"Name":"InjuriesDirect","datatype":"int","Ordinal":6},{"Name":"InjuriesIndirect","datatype":"int","Ordinal":7},{"Name":"DeathsDirect","datatype":"int","Ordinal":8},{"Name":"DeathsIndirect","datatype":"int","Ordinal":9},{"Name":"DamageProperty","datatype":"int","Ordinal":10},{"Name":"DamageCrops","datatype":"int","Ordinal":11},{"Name":"Source","datatype":"string","Ordinal":12},{"Name":"BeginLocation","datatype":"string","Ordinal":13},{"Name":"EndLocation","datatype":"string","Ordinal":14},{"Name":"BeginLat","datatype":"real","Ordinal":16},{"Name":"BeginLon","datatype":"real","Ordinal":17},{"Name":"EndLat","datatype":"real","Ordinal":18},{"Name":"EndLon","datatype":"real","Ordinal":19},{"Name":"EpisodeNarrative","datatype":"string","Ordinal":20},{"Name":"EventNarrative","datatype":"string","Ordinal":21},{"Name":"StormSummary","datatype":"dynamic","Ordinal":22}]'`;

const mappingCommandResults = await kustoClient.executeMgmt(kustoDatabase, createMappingCommand);
console.log(mappingCommandResults.primaryResults[0].toJSON().data);

Köa ett meddelande för inmatning

Köa ett meddelande för att hämta data från bloblagring och mata in dessa data i Azure Data Explorer.

const defaultProps  = new IngestionProperties({
    database: kustoDatabase,
    table: destTable,
    format: DataFormat.CSV,
    ingestionMappingReference: destTableMapping,
    ingestionMappingKind: IngestionMappingKind.CSV,
    additionalProperties: {ignoreFirstRecord: true},
});

const ingestClient = new KustoIngestClient(kcsbIngest, defaultProps);
// All ingestion properties are documented here: https://learn.microsoft.com/azure/kusto/management/data-ingest#ingestion-properties

const blobDesc = new BlobDescriptor(blobPath, 10);
try {
	const ingestionResult = await ingestClient.ingestFromBlob(blobDesc, null);
} catch (err) {
	// Handle errors
}

Verifiera att tabellen innehåller data

Kontrollera att data matades in i tabellen. Vänta i fem till tio minuter innan den köade inmatningen schemalägger inmatningen och läser in data i Azure Data Explorer. Kör sedan följande kod för att hämta antalet poster i StormEvents tabellen.

const query = `${destTable} | count`;

var tableResults = await kustoClient.execute(kustoDatabase, query);
console.log(tableResults.primaryResults[0].toJSON().data);

Köra felsökningsförfrågningar

Logga in på https://dataexplorer.azure.com och anslut till ditt kluster. Kör följande kommando i databasen för att se om det har förekommit några inmatningsfel under de senaste fyra timmarna. Ersätt databasnamnet innan du kör.

.show ingestion failures
| where FailedOn > ago(4h) and Database == "<DatabaseName>"

Kör följande kommando för att visa status för alla inmatningsåtgärder under de senaste fyra timmarna. Ersätt databasnamnet innan du kör.

.show operations
| where StartedOn > ago(4h) and Database == "<DatabaseName>" and Operation == "DataIngestPull"
| summarize arg_max(LastUpdatedOn, *) by OperationId

Rensa resurser

Om du planerar att följa våra andra artiklar behåller du de resurser som du har skapat. Annars kör du följande kommando i databasen för att rensa StormEvents tabellen.

.drop table StormEvents