Cvičení – zavedení proměnných pomocí příkazu let

Dokončeno

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í.

  1. Spusťte tento dotaz:

    Spuštění dotazu

    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:

    Snímek obrazovky dotazu s příkazem let a jeho výsledky

  2. 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.

Spuštění dotazu

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:

Snímek obrazovky s náhledem dotazu let s využitím složitých skalárních a výsledků

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.

  1. Spusťte tento dotaz:

    Spuštění dotazu

    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:

    Snímek obrazovky s dotazem let s využitím složitých skalárních a výsledků

  2. 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.

  1. 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. Tento let 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;
    
  2. 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:

    Spuštění dotazu

    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:

    Snímek obrazovky s příkazem tabulkového let a výsledky

  3. 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)};
  1. Tento let příkaz použijte v následujícím dotazu:

    Spuštění 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:

    Snímek obrazovky příkazu let s výsledky

  2. 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í.