다음을 통해 공유


기본 쿼리를 실행하는 앱 만들기

이 문서에서는 다음 방법을 설명합니다.

사전 요구 사항

Kusto 클라이언트 라이브러리를 사용하도록 개발 환경을 설정합니다.

기본 쿼리 실행 및 결과 처리

기본 설정 IDE 또는 텍스트 편집기에서 기본 언어에 적합한 규칙을 사용하여 기본 쿼리 라는 프로젝트 또는 파일을 만듭니다. 다음 코드를 추가합니다.

  1. 도움말 클러스터에 연결하는 클라이언트 앱을 만듭니다.

    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. 실행할 데이터베이스 및 쿼리를 정의합니다. 이 쿼리는 총 피해가 1억 달러를 초과한 날짜, 상태 및 총 토네이도 관련 피해를 반환합니다.

    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. 쿼리를 실행하고 결과를 인쇄합니다.

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

전체 코드는 다음과 같습니다.

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

앱을 실행합니다.

명령 셸에서 다음 명령을 사용하여 앱을 실행합니다.

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

다음과 유사한 결과가 표시됩니다.

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 $

서수 위치를 사용하여 열 값에 액세스

쿼리 결과의 열 순서를 알면 열 이름보다 결과 집합의 서수 위치로 열 값에 액세스하는 것이 더 효율적입니다. 필요에 따라 런타임에 라이브러리 메서드를 사용하여 열 이름에서 열 서수 를 확인할 수 있습니다.

참고

또는 project-away 연산자를 사용하여 쿼리 결과에서 열의 현재 상태와 순서를 제어할 project 수 있습니다.

예를 들어 이전 코드를 수정하여 결과 집합의 서수 위치로 , StateDailyDamage 열의 StartTime값에 액세스할 수 있습니다.

C#에서는 결과 집합의 서수 위치로만 열 값에 액세스할 수 있습니다. 열 이름은 사용할 수 없습니다. 따라서 코드는 동일하게 유지됩니다.

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

클라이언트 요청 속성을 사용하여 쿼리 동작 사용자 지정

클라이언트 요청 속성을 설정하여 쿼리의 동작을 사용자 지정할 수 있습니다. 사용 가능한 옵션에 대한 자세한 내용은 클라이언트 요청 속성을 참조하세요.

예를 들어 이전 코드의 호출을 kusto_client.execute_query 바꿔 사용자 지정 요청 ID를 전달하고 쿼리 시간 제한을 1분으로 설정할 수 있습니다. 클라이언트 요청 속성을 사용하려면 클래스를 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)) {
}

쿼리 매개 변수를 사용하여 사용자 입력 보호

쿼리 매개 변수는 데이터의 보안 및 보호를 유지하는 데 중요합니다. 데이터에 무단으로 액세스하거나 손상시키려고 시도할 수 있는 잠재적인 악의적 행위자로부터 보호합니다. 매개 변수가 있는 쿼리에 대한 자세한 내용은 쿼리 매개 변수 선언 문을 참조하세요.

예를 들어 이전 코드를 수정하여 EventType 값과 DailyDamage 최소값을 쿼리에 매개 변수로 전달할 수 있습니다. 매개 변수를 사용하려면 다음을 수행합니다.

  1. 쿼리 텍스트에서 매개 변수 선언
  2. 쿼리 텍스트의 속성 값을 매개 변수 이름으로 대체
  3. 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));
  }
}

서수 위치를 사용하여 열 값 및 매개 변수에 액세스하는 전체 코드는 다음과 같습니다.

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

다음과 유사한 결과가 표시됩니다.

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

다음 단계