연습 - let 문을 사용하여 변수 소개
기상 데이터 세트를 사용하여 데이터를 집계하고 시각화했습니다. 여기서는 let
문을 사용하여 변수를 소개하고 복잡한 쿼리를 구성하는 방법을 알아봅니다.
let
문은 복잡한 식을 여러 부분으로 나누고 가독성을 위해 쿼리 본문 외부의 상수를 정의하거나 변수를 한 번 정의하고 쿼리 내에서 여러 번 사용하는 데 유용합니다. let
문을 사용하여 잘 구성된 복잡한 쿼리를 만들 수 있습니다. 여러 let
문을 사용할 수 있습니다. 각 문 뒤에 세미콜론(;
)이 와야 합니다.
let
문은 다양한 유형의 상황에서 사용할 수 있습니다. 나중에 쿼리에서 참조할 스칼라 값(예: int, string, date/time 또는 기타 값)을 가장 간단한 수준에서 정의할 수 있습니다. 쿼리에 대한 테이블 형식 입력으로 사용할 테이블의 테이블 형식 필터링 보기를 만들 수 있습니다. let
문을 사용하여 함수를 만들 수도 있습니다.
let
문을 사용하여 스칼라 정의
이전 쿼리는 위치 또는 최소 피해에 대해 필터링되었습니다. 쿼리의 시작 부분에 있는 let
문을 사용하여 이러한 경계 값을 정의해 보겠습니다.
다음 쿼리는 두 개의 let
문을 사용하여 나중에 쿼리에서 입력 매개 변수로 사용할 스칼라 값을 정의합니다. 첫 번째 정의된 값은 숫자이고 두 번째 값은 문자열입니다. let
문은 세미콜론(;)으로 끝납니다.
이중 슬래시(//
)로 시작하는 쿼리의 주석 처리된 부분을 확인합니다. 이중 슬래시는 해당 줄의 끝까지 주석의 시작을 나타냅니다. 이것은 쿼리를 실행할 때 무시되는 주석입니다.
다음 쿼리를 실행합니다.
let MinDamage = 1; // int let EventLocation = "ARIZONA"; // string StormEvents | where State == EventLocation | where DamageCrops + DamageProperty >= MinDamage | summarize Damage=round(avg(DamageProperty + DamageCrops)) by EventType | sort by Damage
다음 이미지와 같은 결과가 표시됩니다.
상태 이름 또는 최소 피해 번호를 변경하고 쿼리를 다시 실행해 보세요. 결과는 어떻게 변경하나요?
let
문 내에서 테이블 형식 결과를 스칼라 값 toscalar
으로 변환
다음으로 가장 빈번한 이벤트 유형의 수를 시간 함수로 살펴보겠습니다. 먼저 가장 빈번한 이벤트 유형이 무엇인지 파악해야 합니다. 그런 다음, 쿼리에서 이 값을 사용합니다. StormEvents 테이블을 사용하여 각 형식 내의 이벤트 수를 계산하여 상위 EventType을 찾습니다. EventType 열만 반환하려면 project
연산자를 사용합니다.
let
문을 생성하기 전에 쿼리를 실행하여 이 이벤트가 실제로 무엇인지 확인합니다. 이렇게 하면 쿼리가 예상된 결과를 생성하는지 확인할 수 있습니다.
StormEvents
| summarize count() by EventType
| top 1 by count_
| project EventType
다음 이미지와 같은 결과가 표시됩니다.
쿼리가 하나의 열과 하나의 행으로 테이블 형식 결과를 생성한 것을 알 수 있습니다. 그러나 이 결과를 기본 쿼리에서 필터 값으로 사용할 스칼라 값으로 변환하려고 합니다. 먼저 MostFrequentEventType으로 도입할 변수 이름을 정의합니다. 다음으로 전체 쿼리를 toscalar()
함수 내에 배치하여 테이블 형식 결과를 스칼라 값으로 변환하려고 합니다.
이전 단계는 다음 let
문에 요약되어 있습니다.
let MostFrequentEventType = toscalar(
StormEvents
| summarize count() by EventType
| top 1 by count_
| project EventType);
유효한 쿼리에는 let
문이 아닌 문이 적어도 하나 이상 포함되어야 하므로 이 문 자체는 유효한 쿼리가 아닙니다. 그러나 쿼리에서 이 저장된 스칼라 값을 사용할 수 있습니다. 가장 자주 발생하는 이벤트 시간의 수를 시간 함수로 확인하려고 합니다. MostFrequentEventType을 필터링한 다음, 특정 시간 빈으로 개수를 요약합니다.
이 경우, 월별 결과를 살펴보겠습니다. 지정된 날짜 값에 대한 해당 월의 시작을 나타내는 datetime을 반환하는 startofmonth()
함수를 사용합니다. 이 쿼리에서는 StartTime 열을 startofmonth()
함수의 입력으로 사용합니다.
마지막으로 결과를 세로 막대형 차트로 렌더링하여 월별로 범주화되는 가장 빈번한 이벤트 유형 수의 히스토그램을 가져옵니다.
다음 쿼리를 실행합니다.
let MostFrequentEventType = toscalar( StormEvents | summarize count() by EventType | top 1 by count_ | project EventType); StormEvents | where EventType == MostFrequentEventType | summarize count() by startofmonth(StartTime) | render columnchart
다음 이미지와 같은 결과가 표시됩니다.
쿼리를 변경하여 월별로 범주화되는 최소 빈도 이벤트 유형의 히스토그램을 표시하고 쿼리를 다시 실행해 보세요.
테이블 형식 출력을 사용하여 let
문 생성
이전 예제에서는 쿼리에서 입력 매개 변수로 사용할 저장된 스칼라 값을 만들었습니다. 그러나 let
문을 사용하여 쿼리에 대한 입력으로 사용되는 테이블 형식 데이터를 만들 수도 있습니다.
직간접적으로 사망을 초래한 이벤트에 대해 StormEvents 테이블을 필터링합니다. 그런 다음,
project
연산자를 사용하여 열의 하위 집합을 반환합니다. 이 문은 KillerStorms라는 테이블 형식 출력을 제공합니다. 이let
문을 쿼리의 시작 입력으로 사용합니다.let KillerStorms = StormEvents | where DeathsDirect + DeathsIndirect > 0 | project State, EventType, Deaths=DeathsDirect + DeathsIndirect;
그런 다음, 이전 단원에서 배운 집계 함수 중 일부를 사용할 수 있습니다. 다음 쿼리를 실행합니다.
let KillerStorms = StormEvents | where DeathsDirect + DeathsIndirect > 0 | project State, EventType, Deaths=DeathsDirect + DeathsIndirect; KillerStorms | summarize DistinctKillerEventTypes=dcount(EventType), TotalDeaths=sum(Deaths) by State | sort by TotalDeaths
다음 이미지와 같은 결과가 표시됩니다.
결과를 살펴봅니다. 모든 이벤트가 "킬러 폭풍"이라 불리는 DistinctKillerEventTypes 열에 요약되어 있나요?
let
문을 사용하여 사용자 정의 함수 만들기
let
문을 사용하여 재사용 가능한 하위 쿼리인 사용자 정의 함수를 정의할 수도 있습니다. 이벤트 유형별로 발생한 피해 비율을 파악하려는 경우를 가정해 보겠습니다. 백분율을 계산하는 사용자 정의 함수를 만들고 나중에 이 함수를 호출하여 백분율을 계산하는 데 사용할 열을 지정합니다.
let
문 내에서 다음 일반 구문을 사용하여 함수 이름, 인수 및 본문을 선언합니다.
let function=(argument1:datatype, argument2:datatype) {functionbody};
특히 사용자 정의 함수를 사용하여 백분율을 계산합니다. 먼저 데이터 형식 및 입력 인수를 정의합니다. 이 예제에서는 다음 인수를 사용합니다.
인수 이름 | 데이터 형식 | Description |
---|---|---|
portion | real |
백분율을 계산하려는 총 이벤트의 부분입니다. |
total | real |
총 이벤트 수입니다. |
round()
함수를 사용하여 답을 소수점 이하 두 자리로 반올림합니다.
전체적으로 볼 때 let
문에 의해 설명된 사용자 정의 함수는 다음과 같습니다.
let Pcent = (portion:real, total:real){round(100 * portion / total, 2)};
다음 쿼리에서 이
let
문을 사용합니다.let Pcent = (portion: real, total: real) { round(100 * portion / total, 2) }; StormEvents | extend Damage = DamageCrops + DamageProperty | summarize TotalEvents = count(), TotalDamagingEvents = countif(Damage > 0) by EventType | project EventType, TotalDamagingEvents, TotalEvents, Percentage = Pcent(TotalDamagingEvents, TotalEvents) | sort by EventType asc
다음 이미지와 같은 결과가 표시됩니다.
잠시 시간을 내어 결과를 살펴봅니다. 피해 유형별 백분율 분석을 표시하도록 쿼리를 수정하고 쿼리를 다시 실행해 보세요.
결과를 살펴봅니다. 백분율은 무엇을 의미하나요? 쿼리는 let
문에 정의된 Pcent 함수를 호출합니다. 이 함수에 사용되는 입력은 TotalDamagingEvents 및 TotalEvents입니다. 즉, 피해를 일으킨 이벤트의 백분율을 찾고 있습니다.