Udostępnij za pośrednictwem


Tworzenie aplikacji do uruchamiania podstawowych zapytań

Dotyczy: ✅Microsoft FabricAzure Data Explorer

Z tego artykułu dowiesz się, jak wykonywać następujące działania:

Warunki 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 łączne szkody związane z tornado, w których łączne szkody przekroczyły 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 wyświetl 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 konsoli użyj następującego polecenia, aby uruchomić swoją 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 nazwy kolumny. Opcjonalnie, w czasie wykonywania programu, możesz użyć metody biblioteki, aby określić numer kolumny na podstawie jej nazwy.

Notatka

Możesz kontrolować obecność i kolejność kolumn w wyniku zapytania przy użyciu operatorów project lub project-away.

Na przykład można zmodyfikować poprzedni kod, aby uzyskać dostęp do wartości StartTime, Statei DailyDamage kolumn 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 za pomocą 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 parametry żądania klienta.

Możesz na przykład zastąpić wywołanie kusto_client.execute_query w poprzednim kodzie, aby przekazać identyfikator żądania niestandardowego 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 go przed potencjalnymi złośliwymi podmiotami, które mogą próbować uzyskać nieautoryzowany dostęp do lub uszkodzić dane. Aby uzyskać więcej informacji na temat sparametryzowanych zapytań, zobacz deklaracja parametrów zapytania.

Na przykład można zmodyfikować poprzedni kod, aby przekazać wartość EventType i DailyDamage wartość minimalną 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. Ustaw 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 korzystający z 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