다음을 통해 공유


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

적용 대상: ✅Microsoft FabricAzure Data Explorer

이 문서에서는 다음 방법을 알아봅니다.

필수 구성 요소

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

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

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

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

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

예를 들어 이전 코드를 수정하여 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 $

다음 단계

관리 명령 실행하는 앱 만들기