Megosztás a következőn keresztül:


Alkalmazás létrehozása alapszintű lekérdezések futtatásához

Ebben a cikkben az alábbiakkal ismerkedhet meg:

Előfeltételek

Állítsa be a fejlesztési környezetet a Kusto ügyfélkódtár használatára.

Alapszintű lekérdezés futtatása és az eredmények feldolgozása

Az előnyben részesített IDE- vagy szövegszerkesztőben hozzon létre egy egyszerű lekérdezés nevű projektet vagy fájlt az előnyben részesített nyelvnek megfelelő konvenció használatával. Ezután írja be a következő kódot:

  1. Hozzon létre egy ügyfélalkalmazást, amely csatlakozik a súgófürthöz.

    using Kusto.Data;
    using Kusto.Data.Net.Client;
    
    namespace BasicQuery {
      class BasicQuery {
        static void Main(string[] args) {
          var clusterUri = "https://help.kusto.windows.net/";
          var kcsb = new KustoConnectionStringBuilder(clusterUri)
              .WithAadUserPromptAuthentication();
    
          using (var kustoClient = KustoClientFactory.CreateCslQueryProvider(kcsb)) {
          }
        }
      }
    }
    
  2. Határozza meg a futtatni kívánt adatbázist és lekérdezést. A lekérdezés visszaadja a dátumot, az állapotot és a tornádóval kapcsolatos összes kárt, ahol a teljes kár meghaladta a 100 millió dollárt.

    var database = "Samples";
    var query = @"StormEvents
                  | where EventType == 'Tornado'
                  | extend TotalDamage = DamageProperty + DamageCrops
                  | summarize DailyDamage=sum(TotalDamage) by State, bin(StartTime, 1d)
                  | where DailyDamage > 100000000
                  | order by DailyDamage desc";
    
  3. Futtassa a lekérdezést, és nyomtassa ki az eredményt.

    using (var response = kustoClient.ExecuteQuery(database, query, null)) {
      int columnNoStartTime = response.GetOrdinal("StartTime");
      int columnNoState = response.GetOrdinal("State");
      int columnNoDailyDamage = response.GetOrdinal("DailyDamage");
      Console.WriteLine("Daily tornado damages over 100,000,000$:");
    
      while (response.Read()) {
        Console.WriteLine("{0} - {1}, {2}",
          response.GetDateTime(columnNoStartTime),
          response.GetString(columnNoState),
          response.GetInt64(columnNoDailyDamage));
      }
    }
    

A teljes kódnak így kell kinéznie:

using Kusto.Data;
using Kusto.Data.Net.Client;

namespace BasicQuery {
  class BasicQuery {
    static void Main(string[] args) {
      string clusterUri = "https://help.kusto.windows.net/";
      var kcsb = new KustoConnectionStringBuilder(clusterUri)
          .WithAadUserPromptAuthentication();

      using (var kustoClient = KustoClientFactory.CreateCslQueryProvider(kcsb)) {
        string database = "Samples";
        string query = @"StormEvents
                         | where EventType == 'Tornado'
                         | extend TotalDamage = DamageProperty + DamageCrops
                         | summarize DailyDamage=sum(TotalDamage) by State, bin(StartTime, 1d)
                         | where DailyDamage > 100000000
                         | order by DailyDamage desc";

        using (var response = kustoClient.ExecuteQuery(database, query, null)) {
          int columnNoStartTime = response.GetOrdinal("StartTime");
          int columnNoState = response.GetOrdinal("State");
          int columnNoDailyDamage = response.GetOrdinal("DailyDamage");

          Console.WriteLine("Daily tornado damages over 100,000,000$:");

          while (response.Read()) {
            Console.WriteLine("{0} - {1}, {2}",
              response.GetDateTime(columnNoStartTime),
              response.GetString(columnNoState),
              response.GetInt64(columnNoDailyDamage));
          }
        }
      }
    }
  }
}

Futtassa az alkalmazást

Egy parancshéjban futtassa az alkalmazást a következő paranccsal:

# Change directory to the folder that contains the basic queries project
dotnet run .

Az alábbihoz hasonló eredményt kell látnia:

Daily damages tornado with damages over 100,000,000$:
2007-02-02 00:00:00+00:00 - FLORIDA , 270004000 $
2007-03-01 00:00:00+00:00 - ALABAMA , 266853000 $
2007-05-04 00:00:00+00:00 - KANSAS , 251625000 $
2007-03-01 00:00:00+00:00 - GEORGIA , 143688000 $

Sorszámpozíciók használata az oszlopértékek eléréséhez

Ha egy lekérdezés eredményében az oszlopok sorrendje ismert, hatékonyabban érheti el az oszlopok értékeit az eredményhalmaz sorszáma alapján, mint az oszlop neve alapján. Futtatókörnyezetben egy kódtármetódussal is meghatározhatja az oszlop sorszámát az oszlop nevéből.

Megjegyzés

A lekérdezés eredményében szereplő oszlopok jelenlétét és sorrendjét az vagy project-away operátorokkal project szabályozhatja.

Módosíthatja például az előző kódot, hogy az eredményhalmazban lévő sorszámuk alapján elérhesse a StartTime, Statea és DailyDamage az oszlop értékeit:

A C#-ban az oszlopok értékeit csak az eredményhalmazban lévő sorszámuk alapján érheti el. Nem használhatja az oszlopneveket; így a kód változatlan marad.

int columnNoStartTime = response.GetOrdinal("StartTime");
int columnNoState = response.GetOrdinal("State");
int columnNoDailyDamage = response.GetOrdinal("DailyDamage");
Console.WriteLine("Daily tornado damages over 100,000,000$:");

while (response.Read()) {
  Console.WriteLine("{0} - {1}, {2}",
    response.GetDateTime(columnNoStartTime),
    response.GetString(columnNoState),
    response.GetInt64(columnNoDailyDamage));
}

A lekérdezési viselkedés testreszabása az ügyfélkérés tulajdonságaival

A lekérdezések viselkedését az ügyfélkérés tulajdonságainak beállításával szabhatja testre. Az elérhető lehetőségekről további információt az ügyfélkérés tulajdonságai című témakörben talál.

Lecserélheti például az kusto_client.execute_query előző kódban szereplő hívást egy egyéni kérésazonosító átadására, és beállíthatja a lekérdezés időtúllépését 1 percre. Az ügyfélkérés tulajdonságainak használatához importálnia kell az osztályt ClientRequestProperties .

using Kusto.Data.Common;

var crp = new ClientRequestProperties();
// Set a custom client request identifier
crp.ClientRequestId = "QueryDemo" + Guid.NewGuid().ToString();
// Set the query timeout to 1 minute
crp.SetOption(ClientRequestProperties.OptionServerTimeout, "1m");

using (var response = kustoClient.ExecuteQuery(database, query, crp)) {
}

Lekérdezési paraméterek használata a felhasználói bevitel védelméhez

A lekérdezési paraméterek fontosak az adatok biztonságának és védelmének fenntartásához. Megvédi azokat a potenciális rosszindulatú szereplőktől, amelyek jogosulatlan hozzáférést próbálnak szerezni az adatokhoz, vagy megrongálhatják azokat. További információ a paraméteres lekérdezésekről: Lekérdezési paraméterek deklarációs utasítása.

Módosíthatja például az előző kódot úgy, hogy paraméterként adja át az EventType és a DailyDamage minimális értéket a lekérdezésnek. Paraméterek használata:

  1. A paraméterek deklarálása a lekérdezés szövegében
  2. Cserélje le a lekérdezés szövegében lévő tulajdonságértékeket a paraméternevekre
  3. Állítsa be a paraméterértékeket a végrehajtási metódusnak átadott ügyfélkérési tulajdonságokban
string query = @"declare query_parameters(event_type:string, daily_damage:int);
                  StormEvents
                  | where EventType == event_type
                  | extend TotalDamage = DamageProperty + DamageCrops
                  | summarize DailyDamage=sum(TotalDamage) by State, bin(StartTime, 1d)
                  | where DailyDamage > daily_damage
                  | order by DailyDamage desc";

var crp = new ClientRequestProperties();
crp.SetParameter("event_type", "Flash Flood");
crp.SetParameter("daily_damage", 200000000.ToString());

using (var response = kustoClient.ExecuteQuery(database, query, crp)) {
  int columnNoStartTime = response.GetOrdinal("StartTime");
  int columnNoState = response.GetOrdinal("State");
  int columnNoDailyDamage = response.GetOrdinal("DailyDamage");
  Console.WriteLine("Daily flash flood damages over 200,000,000$:");

  while (response.Read()) {
    Console.WriteLine("{0} - {1}, {2}",
      response.GetDateTime(columnNoStartTime),
      response.GetString(columnNoState),
      response.GetInt64(columnNoDailyDamage));
  }
}

Az oszlopértékek és -paraméterek eléréséhez sorszámhelyeket használó teljes kódnak így kell kinéznie:

using Kusto.Data;
using Kusto.Data.Common;
using Kusto.Data.Net.Client;

namespace BasicQuery {
  class BasicQuery {
    static void Main(string[] args) {
      string clusterUri = "https://help.kusto.windows.net/";
      var kcsb = new KustoConnectionStringBuilder(clusterUri)
          .WithAadUserPromptAuthentication();

      using (var kustoClient = KustoClientFactory.CreateCslQueryProvider(kcsb)) {
        string database = "Samples";
        string query = @"declare query_parameters(event_type:string, daily_damage:int);
                         StormEvents
                         | where EventType == event_type
                         | extend TotalDamage = DamageProperty + DamageCrops
                         | summarize DailyDamage=sum(TotalDamage) by State, bin(StartTime, 1d)
                         | where DailyDamage > daily_damage
                         | order by DailyDamage desc";

        var crp = new ClientRequestProperties();
        crp.ClientRequestId = "QueryDemo" + Guid.NewGuid().ToString();
        crp.SetOption(ClientRequestProperties.OptionServerTimeout, "1m");
        crp.SetParameter("event_type", "Flash Flood");
        crp.SetParameter("daily_damage", 200000000.ToString());

        using (var response = kustoClient.ExecuteQuery(database, query, crp)) {
          int columnNoStartTime = response.GetOrdinal("StartTime");
          int columnNoState = response.GetOrdinal("State");
          int columnNoDailyDamage = response.GetOrdinal("DailyDamage");

          Console.WriteLine("Daily flash flood damages over 200,000,000$:");

          while (response.Read()) {
            Console.WriteLine("{0} - {1}, {2}",
              response.GetDateTime(columnNoStartTime),
              response.GetString(columnNoState),
              response.GetInt64(columnNoDailyDamage));
          }
        }
      }
    }
  }
}

Az alábbihoz hasonló eredményt kell látnia:

Daily flash flood damages over 200,000,000$:
2007-08-21 00:00:00+00:00 - OHIO , 253320000 $

Következő lépés