Esercizio - Introdurre le variabili usando l'istruzione let
È stato usato un set di dati meteorologico per aggregare e visualizzare i dati. In questo articolo si apprenderà come usare le istruzioni let
per introdurre le variabili e organizzare query complesse.
Le istruzioni let
sono utili per suddividere un'espressione complessa in più parti, definendo costanti al di fuori del corpo della query per la leggibilità oppure definendo una variabile una sola volta e usandola più volte all'interno di una query. Possono essere usate le istruzioni let
per creare query complesse ben organizzate. È possibile usare più let
istruzioni let; ogni istruzione deve essere seguita da un punto e virgola (;
).
Possono essere usate le istruzioni let
in diversi tipi di situazioni. Nel livello più semplice è possibile definire valori scalari a cui si farà riferimento in un secondo momento in una query, ad esempio int, stringa, data/ora o qualsiasi altro valore. È possibile creare una visualizzazione filtrata tabulare di una tabella che verrà usata come input tabulare per la query. È anche possibile creare una funzione usando un'istruzione let
.
Definire un valore scalare con un'istruzione let
Tenere presente che le query precedenti hanno applicato un filtro in base alla posizione o a danni minimi. Definire questi valori limite usando un'istruzione let
all'inizio della query.
La query seguente usa due istruzioni let
per definire i valori scalari che verranno successivamente usati come parametri di input nella query. Il primo valore definito è un numero e il secondo è una stringa. Le istruzioni let
terminano con un punto e virgola.
Si notino le parti commentate della query che iniziano con barre doppie (//
). Le barre doppie indicano l'inizio di un commento fino alla fine della riga. Questi commenti sono stati ignorati durante l'esecuzione delle query.
Eseguire la query riportata di seguito:
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
Dovrebbero essere visualizzati risultati simili all'immagine seguente:
Provare a modificare il nome dello stato o i numeri di danno minimo e a ripetere la query. Come cambiano i risultati?
Convertire un risultato tabulare in un valore scalare usando toscalar
all'interno di un'istruzione let
Esaminare successivamente un conteggio del tipo di evento più frequente in funzione del tempo. Prima di tutto, è necessario capire qual è il tipo di evento più frequente. Questo valore verrà quindi usato in una query. Usare la tabella StormEvents per trovare l'oggetto EventType principale contando il numero di eventi all'interno di ogni tipo. Usare l'operatore project
per restituire solo la colonna EventType.
Prima di iniziare a costruire l'istruzione let
, eseguire la query per scoprire qual è effettivamente l'evento. In questo modo è possibile verificare che la query produca i risultati previsti.
StormEvents
| summarize count() by EventType
| top 1 by count_
| project EventType
Dovrebbero essere visualizzati risultati simili all'immagine seguente:
Si noterà che la query ha prodotto un risultato tabulare con una colonna e una riga. Tuttavia, si vuole convertire questo valore in un valore scalare da usare come valore di filtro nella query principale. Definire innanzitutto il nome della variabile che si desidera introdurre come MostFrequentEventType. Successivamente, si vuole convertire il risultato tabulare in un valore scalare inserendo l'intera query all'interno della funzione toscalar()
.
I passaggi precedenti vengono riepilogati nell'istruzione let
seguente:
let MostFrequentEventType = toscalar(
StormEvents
| summarize count() by EventType
| top 1 by count_
| project EventType);
Si noti che questa istruzione non è una query valida, perché una query valida deve contenere almeno un'istruzione che non è un'istruzione let
. È tuttavia possibile usare questo valore scalare archiviato in una query. Si ricordi che si vuole esaminare l'ora di evento più frequente in funzione del tempo. Si applicherà un filtro in base a MostFrequentEventType, quindi si riepilogherà il numero in base a un determinato bin di tempo.
In questo caso verranno esaminati i risultati per mese. Si userà la funzione startofmonth()
, che restituisce un valore di datatime che rappresenta l'inizio del mese per il valore di data specificato. In questa query si userà la colonna StartTime come input per la funzione startofmonth()
.
Infine, si esegue il rendering dei risultati come grafico a colonne per ottenere un istogramma del numero del tipo di evento più frequente in bin per mese.
Eseguire la query riportata di seguito:
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
Dovrebbero essere visualizzati risultati simili all'immagine seguente:
Provare a modificare la query per visualizzare un istogramma del tipo di evento meno frequente in bin per mese e a eseguire di nuovo la query.
Costruire un'istruzione let
con output tabulare
Gli esempi precedenti hanno creato un valore scalare archiviato da usare come parametro di input in una query. Tuttavia, è anche possibile usare un'istruzione let
per creare dati tabulari che vengono quindi usati come input per una query.
Filtrare la tabella StormEvents in base agli eventi che indirettamente o direttamente hanno causato morti. Restituire quindi un subset delle colonne usando l'operatore
project
. Questa istruzione genera un output tabulare denominato KillerStorms. Usare questa istruzionelet
come input iniziale per la query.let KillerStorms = StormEvents | where DeathsDirect + DeathsIndirect > 0 | project State, EventType, Deaths=DeathsDirect + DeathsIndirect;
È quindi possibile usare alcune delle funzioni di aggregazione apprese nelle unità precedenti. Eseguire la query riportata di seguito:
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
Dovrebbero essere visualizzati risultati simili all'immagine seguente:
Esaminare i risultati. Tutti gli eventi vengono riepilogati nella colonna DistinctKillerEventTypes denominata "killer storms"?
Creare una funzione definita dall'utente con l'istruzione let
È anche possibile usare istruzioni let
per definire funzioni definite dall'utente, che sono sottoquery riutilizzabili. Si supponga di voler capire quale percentuale di ciascun tipo di evento ha causato danni. Si creerà una funzione definita dall'utente che calcola le percentuali e in seguito chiamerà questa funzione e si specificherà quali colonne devono essere usate per calcolare la percentuale.
All'interno di un'istruzione let
si dichiarerà il nome della funzione, gli argomenti e il corpo usando la sintassi generale seguente:
let function=(argument1:datatype, argument2:datatype) {functionbody};
In particolare, si userà una funzione definita dall'utente per calcolare le percentuali. Definire prima di tutto il tipo di dati e gli argomenti di input. Per questo esempio si useranno gli argomenti seguenti:
Nome dell'argomento | Tipo di dati | Descrizione |
---|---|---|
portion | real |
Parte degli eventi totali di cui si vuole calcolare la percentuale. |
totale | real |
Numero totale di eventi. |
Si arrotonderà la risposta a due posizioni decimali usando la funzione round()
.
Presa nel complesso, la funzione definita dall'utente descritta dall'istruzione let
è:
let Pcent = (portion:real, total:real){round(100 * portion / total, 2)};
Usare questa istruzione
let
nella query seguente: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
Dovrebbero essere visualizzati risultati simili all'immagine seguente:
Fermarsi un momento per esaminare i risultati. Provare a modificare la query per visualizzare una suddivisione della percentuale in base al tipo di danno e a ripetere la query.
Si osservino i risultati. Che cosa indica la percentuale? Si noti che la query chiama la funzione Pcent, definita nell'istruzione let
. Gli input usati in questa funzione sono TotalDamagingEvents e TotalEvents, il che significa che si sta cercando la percentuale di eventi che hanno causato danni.