Ejercicio: introducción de variables mediante la instrucción Let

Completado

Hemos usado un conjunto de datos meteorológicos para agregar y visualizar datos. Aquí, aprenderá a usar las instrucciones let para introducir variables y organizar consultas complejas.

Las instrucciones let son útiles para dividir una expresión compleja en varias partes, definir las constantes fuera del cuerpo de la consulta para mejorar la legibilidad o definir una variable una vez y usarla varias veces dentro de una consulta. Puede usar instrucciones let para crear consultas complejas bien organizadas. Puede usar varias instrucciones let; cada una de ellas debe ir seguida de un punto y coma (;).

Puede usar instrucciones let en diferentes tipos de situaciones. En el nivel más sencillo, puede definir valores escalares a los que se hará referencia más adelante en una consulta, como int, string, date/time o cualquier otro valor. Puede crear una vista filtrada tabular de una tabla que se usará como entrada tabular para la consulta. También puede crear una función mediante una instrucción let.

Definición de un escalar con una instrucción let

Recuerde que las consultas anteriores filtraban por ubicaciones o daños mínimos. Vamos a definir estos valores de límite mediante una instrucción let al principio de la consulta.

En la consulta siguiente, se usan dos instrucciones let para definir valores escalares que se usarán posteriormente como parámetros de entrada en la consulta. El primer valor definido es un número y el segundo es una cadena. El resto de las instrucciones let finalizan con un punto y coma.

Observe las partes convertidas en comentario de la consulta que comienzan con barras diagonales dobles (//). Las barras diagonales dobles indican el principio de un comentario hasta el final de la línea. Estos comentarios se omiten al ejecutar consultas.

  1. Ejecute la siguiente consulta:

    Ejecución de la consulta

    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
    

    Debería obtener resultados similares a la imagen siguiente:

    Screenshot of query using the let statement and its results.

  2. Pruebe a cambiar el nombre del estado o los números de daños mínimos y vuelva a ejecutar la consulta. ¿Cómo cambian los resultados?

Conversión de un resultado tabular en un valor escalar mediante toscalar dentro de una instrucción let

A continuación, echemos un vistazo a un recuento del tipo de evento más frecuente como una función de tiempo. En primer lugar, debe averiguar cuál es el tipo de evento más frecuente. A continuación, usará este valor en una consulta. Use la tabla StormEvents para buscar el valor de EventType superior mediante el recuento del número de eventos dentro de cada tipo. Use el operador project para devolver solo la columna EventType.

Antes de empezar a construir la instrucción let, ejecute la consulta para averiguar cuál es realmente este evento. Esto le permite comprobar que la consulta genera los resultados esperados.

Ejecución de la consulta

StormEvents
| summarize count() by EventType
| top 1 by count_
| project EventType

Debería obtener resultados similares a la imagen siguiente:

Screenshot of preview of let query using complicated scalar and results.

Observará que la consulta generó un resultado tabular con una columna y una fila. Sin embargo, querrá convertirlo en un valor escalar que se usará como un valor de filtro en la consulta principal. En primer lugar, defina el nombre de la variable que queremos introducir como MostFrequentEventType. A continuación, convierta el resultado tabular en un valor escalar colocando toda la consulta dentro de la función toscalar().

Los pasos anteriores se resumen en la siguiente instrucción let:

let MostFrequentEventType = toscalar(
    StormEvents
    | summarize count() by EventType
    | top 1 by count_
    | project EventType);

Tenga en cuenta que esta instrucción por sí misma no es una consulta válida, ya que una consulta válida debe contener al menos una instrucción que no sea una instrucción let. Sin embargo, puede usar este valor escalar almacenado en una consulta. Recuerde que quiere ver un recuento de la hora de evento más frecuente como una función de tiempo. Filtrará por MostFrequentEventType y, a continuación, resumirá el recuento por un rango de tiempo determinado.

En este caso, echemos un vistazo a los resultados al mes. Usará la función startofmonth(), que devuelve una fecha y hora que representa el inicio del mes para el valor de fecha especificado. En esta consulta, usará la columna StartTime como entrada de la función startofmonth().

Por último, representará los resultados como un gráfico de columnas para obtener un histograma del recuento del tipo de evento más frecuente con un rango por mes.

  1. Ejecute la siguiente consulta:

    Ejecución de la consulta

    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
    

    Debería obtener resultados similares a la imagen siguiente:

    Screenshot of let query using complicated scalar and results.

  2. Pruebe a cambiar la consulta para que muestre un histograma del tipo de evento menos frecuente con un rango por mes y a volver a ejecutar la consulta.

Construcción de una instrucción let con salida tabular

Los ejemplos anteriores crearon un valor escalar almacenado que se usará como parámetro de entrada en una consulta. Sin embargo, también es posible usar una instrucción let para crear datos tabulares que luego se usan como entrada en una consulta.

  1. Filtre la tabla StormEvents por los eventos que causaron muertes directa o indirectamente. A continuación, devuelva un subconjunto de las columnas mediante el operador project. Esta instrucción proporciona una salida tabular denominada KillerStorms. Use esta instrucción let como entrada inicial para la consulta.

    let KillerStorms =
        StormEvents
        | where DeathsDirect + DeathsIndirect > 0
        | project State, EventType, Deaths=DeathsDirect + DeathsIndirect;
    
  2. A continuación, puede usar algunas de las funciones de agregación que ha aprendido en unidades anteriores. Ejecute la siguiente consulta:

    Ejecución de la consulta

    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
    

    Debería obtener resultados similares a la imagen siguiente:

    Screenshot of tabular let statement and results.

  3. Mire los resultados. ¿Se resumen todos los eventos en la columna DistinctKillerEventTypes denominadas "killer storms"?

Creación de una función definida por el usuario con la instrucción let

También puede usar instrucciones let para definir funciones definidas por el usuario, que son subconsultas reutilizables. Supongamos que quiere averiguar qué porcentaje de cada tipo de evento causó daños. Creará una función definida por el usuario que calculará porcentajes y, posteriormente, llamará a esta función y especificará qué columnas se usarán para calcular el porcentaje.

Dentro de una instrucción let, declarará el nombre de la función, los argumentos y el cuerpo mediante la siguiente sintaxis general:

let function=(argument1:datatype, argument2:datatype) {functionbody};

En concreto, usará una función definida por el usuario para calcular porcentajes. En primer lugar, defina el tipo de datos y los argumentos de entrada. En este ejemplo, usará los argumentos siguientes:

Nombre de argumento Tipo de datos Descripción
portion real La parte de los eventos totales de los que quiere calcular el porcentaje.
total real Número total de eventos.

Redondeará la respuesta a dos posiciones decimales mediante la función round().

Tomada por completo, la función definida por el usuario descrita por la instrucción let es:

let Pcent = (portion:real, total:real){round(100 * portion / total, 2)};
  1. Use esta instrucción let en la consulta siguiente:

    Ejecución de la consulta

    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
    

    Debería obtener resultados similares a la imagen siguiente:

    Screenshot of let statement with results.

  2. Dedique un momento a comprender los resultados. Pruebe a modificar la consulta para mostrar un desglose del porcentaje por tipo de daño y a volver a ejecutar la consulta.

Mire los resultados. ¿Qué significa el porcentaje? Observe que la consulta llama a la función Pcent, que definimos en la instrucción let. Las entradas usadas en esta función son TotalDamagingEvents y TotalEvents, lo que significa que busca el porcentaje de eventos que causaron daños.