Övning – Introducera variabler med hjälp av let-instruktionen
Vi har använt en meteorologisk datamängd för att aggregera och visualisera data. Här får du lära dig hur du använder let
instruktioner för att introducera variabler och organisera komplexa frågor.
let
-instruktioner är användbara för att dela upp ett komplext uttryck i flera delar, definiera konstanter utanför frågetexten för läsbarhet eller definiera en variabel en gång och använda den flera gånger i en fråga. Du kan använda let
instruktioner för att skapa välorganiserade komplexa frågor. Du kan använda flera let
instruktioner. Varje instruktion måste följas av ett semikolon (;
).
Du kan använda let
instruktioner i olika typer av situationer. På den enklaste nivån kan du definiera skalära värden som senare kommer att refereras till i en fråga, till exempel en int, sträng, datum/tid eller något annat värde. Du kan skapa en tabellfiltrerad vy av en tabell som ska användas som tabellindata för frågan. Du kan också skapa en funktion med hjälp av en let
-instruktion.
Definiera en skalär med en let
instruktion
Kom ihåg att tidigare frågor har filtrerats på platser eller minsta möjliga skada. Nu ska vi definiera dessa gränsvärden med hjälp av en let
-instruktion i början av frågan.
Följande fråga använder två let
instruktioner för att definiera skalära värden som senare ska användas som indataparametrar i frågan. Det första definierade värdet är ett tal och det andra är en sträng. -uttrycken let
slutar med ett semikolon.
Observera de utkommenterade delarna av frågan som börjar med dubbla snedstreck (//
). Dubbla snedstreck anger början på en kommentar till slutet av raden. Det här är kommentarer som ignoreras när du kör frågor.
Kör följande fråga:
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
Du bör få resultat som ser ut som följande bild:
Prova att ändra tillståndsnamnet eller minsta antal skador och kör frågan igen. Hur ändras resultatet?
Konvertera ett tabellresultat till ett skalärt värde med hjälp av toscalar
en let
instruktion
Nu ska vi titta på antalet av de vanligaste händelsetyperna som en funktion av tiden. Först måste du ta reda på vilken som är den vanligaste händelsetypen. Sedan använder du det här värdet i en fråga. Använd tabellen StormEvents för att hitta den översta EventType genom att räkna antalet händelser inom varje typ. Använd operatorn project
för att endast returnera kolumnen EventType .
Innan du börjar skapa -instruktionen let
kör du frågan för att ta reda på vad den här händelsen faktiskt är. På så sätt kan du kontrollera att frågan genererar det förväntade resultatet.
StormEvents
| summarize count() by EventType
| top 1 by count_
| project EventType
Du bör få resultat som ser ut som följande bild:
Du kommer att märka att frågan gav ett tabellresultat med en kolumn och en rad. Du vill dock konvertera detta till ett skalärt värde som skalärt värde som ska användas som ett filtervärde i huvudfrågan. Definiera först det variabelnamn som vi vill introducera som MostFrequentEventType. Sedan vill du konvertera tabellresultatet till ett skalärt värde genom att placera hela frågan i toscalar()
funktionen.
Föregående steg sammanfattas i följande let
instruktion:
let MostFrequentEventType = toscalar(
StormEvents
| summarize count() by EventType
| top 1 by count_
| project EventType);
Observera att den här instruktionen i sig inte är en giltig fråga eftersom en giltig fråga måste innehålla minst en instruktion som inte är en let
-instruktion. Du kan dock använda det här lagrade skalärvärdet i en fråga. Kom ihåg att du vill titta på antalet händelser som är vanligast som en tidsfunktion. Du filtrerar på MostFrequentEventType och sammanfattar sedan antalet med en viss tidsintervall.
I det här fallet ska vi titta på resultatet per månad. Du använder startofmonth()
funktionen som returnerar en datetime som representerar början av månaden för det angivna datumvärdet. I den här frågan använder du kolumnen StartTime som indata för startofmonth()
funktionen.
Rendera slutligen resultatet som ett stapeldiagram för att få ett histogram över antalet av de vanligaste händelsetyperna som är indelade per månad.
Kör följande fråga:
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
Du bör få resultat som ser ut som följande bild:
Prova att ändra frågan för att visa ett histogram av den minst frekventa händelsetypen som är uppdelad efter månad och kör frågan igen.
Skapa en let
instruktion med tabellutdata
I föregående exempel skapades ett lagrat skalärt värde som ska användas som indataparameter i en fråga. Men det är också möjligt att använda en let
instruktion för att skapa tabelldata som sedan används som indata till en fråga.
Filtrera tabellen StormEvents efter händelser som indirekt eller direkt orsakade dödsfall. Returnera sedan en delmängd av kolumnerna med operatorn
project
. Den här instruktionen ger tabellutdata som kallas KillerStorms. Använd den härlet
instruktionen som startindata för din fråga.let KillerStorms = StormEvents | where DeathsDirect + DeathsIndirect > 0 | project State, EventType, Deaths=DeathsDirect + DeathsIndirect;
Sedan kan du använda några av de aggregeringsfunktioner som du har lärt dig i tidigare enheter. Kör följande fråga:
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
Du bör få resultat som ser ut som följande bild:
Titta på resultaten. Sammanfattas alla händelser i kolumnen DistinctKillerEventTypes så kallade "killer storms"?
Skapa en användardefinierad funktion med instruktionen let
Du kan också använda let
instruktioner för att definiera användardefinierade funktioner, som är återanvändbara underfrågor. Anta att du vill ta reda på vilken procent av varje händelsetyp som orsakat skada. Du skapar en användardefinierad funktion som beräknar procentandelar och senare anropar den här funktionen och anger vilka kolumner som ska användas för att beräkna procentandelen.
I en let
instruktion deklarerar du funktionsnamn, argument och brödtext med hjälp av följande allmänna syntax:
let function=(argument1:datatype, argument2:datatype) {functionbody};
Mer specifikt använder du en användardefinierad funktion för att beräkna procentandelar. Definiera först datatypen och indataargumenten. I det här exemplet använder du följande argument:
Argumentnamn | Datatyp | Description |
---|---|---|
Del | real |
Den del av det totala antalet händelser som du vill beräkna procentandelen av. |
summa | real |
Det totala antalet händelser. |
Du avrundar svaret till två decimaler med hjälp av round()
funktionen .
Den användardefinierade funktion som beskrivs i -instruktionen let
är helt och hållet:
let Pcent = (portion:real, total:real){round(100 * portion / total, 2)};
Använd den här
let
instruktionen i följande fråga: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
Du bör få resultat som ser ut som följande bild:
Ta en stund att förstå resultaten. Prova att ändra frågan för att visa en uppdelning av procentandelen efter skadetyp och kör frågan igen.
Ta en titt på resultaten. Vad betyder procentandelen? Observera att frågan anropar funktionen Pcent , som vi definierade i -instruktionen let
. Indata som används i den här funktionen är TotalDamagingEvents och TotalEvents, vilket innebär att du letar efter procentandelen händelser som orsakade skador.