Cvičení – zavedení proměnných pomocí příkazu let
K agregaci a vizualizaci dat jsme použili meteorologickou datovou sadu. Tady se dozvíte, jak pomocí let
příkazů zavést proměnné a uspořádat složité dotazy.
let
Příkazy jsou užitečné pro rozdělení komplexního výrazu do více částí, definování konstant mimo tělo dotazu pro čitelnost nebo definování proměnné jednou a její použití vícekrát v rámci dotazu. Příkazy můžete použít let
k vytváření dobře uspořádaných složitých dotazů. Můžete použít více let
příkazů; za každým příkazem musí následovat středník (;
).
Příkazy můžete použít let
v různých typech situací. Na nejjednodušší úrovni můžete definovat skalární hodnoty, na které se později v dotazu odkazuje, například int, řetězec, datum a čas nebo libovolná jiná hodnota. Můžete vytvořit tabulkové filtrované zobrazení tabulky, která se použije jako tabulkový vstup pro dotaz. Funkci můžete vytvořit také pomocí let
příkazu.
Definování skaláru let
pomocí příkazu
Vzpomeňte si, že předchozí dotazy filtrovaly umístění nebo minimální poškození. Pojďme tyto hodnoty hranic definovat pomocí let
příkazu na začátku dotazu.
Následující dotaz používá dva let
příkazy k definování skalárních hodnot, které se později použijí jako vstupní parametry v dotazu. První definovaná hodnota je číslo a druhý je řetězec. Příkazy let
končí středníkem.
Všimněte si zakomentovaných částí dotazu, které začínají dvojitými lomítky (//
). Dvojitá lomítka označují začátek komentáře až do konce řádku. Jedná se o komentáře, které se při spouštění dotazů ignorují.
Spusťte tento dotaz:
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
Měli byste získat výsledky, které vypadají jako na následujícím obrázku:
Zkuste změnit název stavu nebo minimální čísla poškození a znovu spustit dotaz. Jak se výsledky mění?
Převedení tabulkového výsledku na skalární hodnotu pomocí toscalar
příkazu let
V dalším kroku se podíváme na počet nejčastějších typů událostí jako funkci času. Nejprve je potřeba zjistit, který typ události je nejčastější. Pak tuto hodnotu použijete v dotazu. Pomocí tabulky StormEvents vyhledejte top EventType tak, že spočítáte počet událostí v rámci každého typu. Pomocí operátoru project
vrátíte pouze sloupec EventType .
Před zahájením let
vytváření příkazu spusťte dotaz, abyste zjistili, co tato událost skutečně je. To vám umožní ověřit, že dotaz vytváří očekávané výsledky.
StormEvents
| summarize count() by EventType
| top 1 by count_
| project EventType
Měli byste získat výsledky, které vypadají jako na následujícím obrázku:
Všimněte si, že dotaz vytvořil tabulkový výsledek s jedním sloupcem a jedním řádkem. Budete ho ale chtít převést na skalární hodnotu, která se použije jako hodnota filtru v hlavním dotazu. Nejprve definujte název proměnné, kterou chceme zavést jako MostFrequentEventType. Dále chcete převést tabulkový výsledek na skalární hodnotu tak, že vložíte celý dotaz do toscalar()
funkce.
Předchozí kroky jsou shrnuty v následujícím let
příkazu:
let MostFrequentEventType = toscalar(
StormEvents
| summarize count() by EventType
| top 1 by count_
| project EventType);
Všimněte si, že samotný příkaz není platným dotazem, protože platný dotaz musí obsahovat alespoň jeden příkaz, který není příkazem let
. Tuto uloženou skalární hodnotu ale můžete použít v dotazu. Vzpomeňte si, že se chcete podívat na počet nejčastějších časů událostí jako na funkci času. Vyfiltrujete mostFrequentEventType a pak shrnete počet podle určitého časového intervalu.
V tomto případě se podíváme na výsledky za měsíc. Použijete startofmonth()
funkci, která vrátí hodnotu datetime představující začátek měsíce pro danou hodnotu data. V tomto dotazu použijete sloupec StartTime jako vstup funkce startofmonth()
.
Nakonec vykreslíte výsledky jako sloupcový graf, abyste získali histogram počtu nejčastějších typů událostí rozložených podle měsíce.
Spusťte tento dotaz:
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
Měli byste získat výsledky, které vypadají jako na následujícím obrázku:
Zkuste změnit dotaz tak, aby zobrazoval histogram nejméně častého typu události v intervalu po měsíci a znovu dotaz zopakoval.
let
Vytvoření příkazu s tabulkovým výstupem
Předchozí příklady vytvořily uloženou skalární hodnotu, která se použije jako vstupní parametr v dotazu. Můžete ale také použít let
příkaz k vytvoření tabulkových dat, která se pak použijí jako vstup dotazu.
Vyfiltrujte tabulku StormEvents na události, které nepřímo nebo přímo způsobily úmrtí. Potom pomocí operátoru
project
vraťte podmnožinu sloupců. Tento příkaz poskytuje tabulkový výstup s názvem KillerStorms. Tentolet
příkaz použijte jako počáteční vstup pro váš dotaz.let KillerStorms = StormEvents | where DeathsDirect + DeathsIndirect > 0 | project State, EventType, Deaths=DeathsDirect + DeathsIndirect;
Pak můžete použít některé agregační funkce, které jste se naučili v předchozích lekcích. Spusťte tento dotaz:
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
Měli byste získat výsledky, které vypadají jako na následujícím obrázku:
Podívejte se na výsledky. Jsou všechny události shrnuté ve sloupci DistinctKillerEventTypes tak, jak se říká "killer storms?".
Vytvoření uživatelem definované funkce pomocí let
příkazu
Příkazy můžete použít let
také k definování uživatelem definovaných funkcí, což jsou opakovaně použitelné poddotazy. Předpokládejme, že chcete zjistit, jaké procento každého typu události způsobilo poškození. Vytvoříte uživatelem definovanou funkci, která vypočítá procenta, a později tuto funkci zavoláte a určíte, které sloupce se mají použít k výpočtu procenta.
let
V příkazu deklarujete název funkce, argumenty a text pomocí následující obecné syntaxe:
let function=(argument1:datatype, argument2:datatype) {functionbody};
Konkrétně použijete uživatelem definovanou funkci k výpočtu procent. Nejprve definujte datový typ a vstupní argumenty. V tomto příkladu použijete následující argumenty:
Název argumentu | Datový typ | Popis |
---|---|---|
část | real |
Část celkových událostí, které chcete vypočítat procento. |
total | real |
Celkový počet událostí. |
Pomocí funkce zaokrouhlíte odpověď na dvě desetinná místa round()
.
Zcela vzato je uživatelsky definovaná funkce popsaná příkazem let
:
let Pcent = (portion:real, total:real){round(100 * portion / total, 2)};
Tento
let
příkaz použijte v následujícím dotazu: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
Měli byste získat výsledky, které vypadají jako na následujícím obrázku:
Chvíli porozumíte výsledkům. Zkuste upravit dotaz tak, aby zobrazoval rozpis procenta podle typu poškození a znovu dotaz.
Podívejte se na výsledky. Co znamená procento? Všimněte si, že dotaz volá funkci Pcent , kterou jsme definovali v let
příkazu. Vstupy použité v této funkci jsou TotalDamagingEvents a TotalEvents, což znamená, že hledáte procento událostí, které způsobily poškození.