Tworzenie aplikacji do uruchamiania podstawowych zapytań

W tym artykule omówiono sposób wykonywania następujących zadań:

Wymagania wstępne

Skonfiguruj środowisko deweloperskie do korzystania z biblioteki klienta Kusto.

Uruchamianie podstawowego zapytania i przetwarzanie wyników

W preferowanym środowisku IDE lub edytorze tekstów utwórz projekt lub plik o nazwie podstawowe zapytanie przy użyciu konwencji odpowiedniej dla preferowanego języka. Następnie dodaj następujący kod:

  1. Utwórz aplikację kliencką, która łączy się z klastrem pomocy.

    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. Zdefiniuj bazę danych i zapytanie do uruchomienia. Zapytanie zwraca datę, stan i łączną szkodę związaną z tornado, gdzie łączna szkoda przekroczyła 100 milionów dolarów.

    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. Uruchom zapytanie i wydrukuj wynik.

    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));
      }
    }
    

Pełny kod powinien wyglądać następująco:

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));
          }
        }
      }
    }
  }
}

Uruchamianie aplikacji

W powłoce poleceń użyj następującego polecenia, aby uruchomić aplikację:

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

Powinien zostać wyświetlony wynik podobny do następującego:

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 $

Uzyskiwanie dostępu do wartości kolumn przy użyciu pozycji porządkowych

Gdy kolejność kolumn w wyniku zapytania jest znana, bardziej wydajne jest uzyskiwanie dostępu do wartości kolumn według ich położenia porządkowego w zestawie wyników niż według ich nazwy kolumny. Opcjonalnie w czasie wykonywania można użyć metody biblioteki do określenia porządkowej kolumny z jego nazwy kolumny.

Uwaga

Obecność i kolejność kolumn w wyniku zapytania można kontrolować przy użyciu project operatorów or project-away .

Możesz na przykład zmodyfikować poprzedni kod, aby uzyskać dostęp do wartości StartTimekolumn , Statei DailyDamage według ich pozycji porządkowych w zestawie wyników:

W języku C#można uzyskać dostęp tylko do wartości kolumn według ich pozycji porządkowych w zestawie wyników. Nie można używać nazw kolumn; w związku z tym kod pozostaje taki sam.

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));
}

Dostosowywanie zachowania zapytania przy użyciu właściwości żądania klienta

Zachowanie zapytania można dostosować, ustawiając właściwości żądania klienta. Aby uzyskać więcej informacji na temat dostępnych opcji, zobacz właściwości żądania klienta.

Możesz na przykład zastąpić kusto_client.execute_query wywołanie w poprzednim kodzie, aby przekazać niestandardowy identyfikator żądania i ustawić limit czasu zapytania na 1 minutę. Aby użyć właściwości żądania klienta, należy zaimportować klasę 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)) {
}

Używanie parametrów zapytania do ochrony danych wejściowych użytkownika

Parametry zapytania są ważne dla utrzymania bezpieczeństwa i ochrony danych. Chroni je przed potencjalnymi złośliwymi podmiotami, które mogą próbować uzyskać nieautoryzowany dostęp do danych lub uszkodzić je. Aby uzyskać więcej informacji na temat sparametryzowanych zapytań, zobacz Instrukcje deklaracji parametrów zapytania.

Możesz na przykład zmodyfikować poprzedni kod, aby przekazać wartość EventType i wartość minimalną DailyDamage jako parametry zapytania. Aby użyć parametrów:

  1. Deklarowanie parametrów w tekście zapytania
  2. Zastąp wartości właściwości w tekście zapytania nazwami parametrów
  3. Ustawianie wartości parametrów we właściwościach żądania klienta przekazanych do metody execute
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));
  }
}

Pełny kod używający pozycji porządkowych w celu uzyskania dostępu do wartości kolumn i parametrów powinien wyglądać następująco:

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));
          }
        }
      }
    }
  }
}

Powinien zostać wyświetlony wynik podobny do następującego:

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

Następny krok