Escribir consultas para el Explorador de datos de Azure
En este artículo, aprenderá a usar el lenguaje de consulta en el Explorador de datos de Azure para realizar consultas básicas con los operadores más comunes. También se expondrá a algunas de las características más avanzadas del lenguaje.
Requisitos previos
- Suscripción a Azure. Cree una cuenta de Azure gratuita.
- Cree un clúster y una base de datos.
Puede ejecutar las consultas de este artículo de dos maneras:
En el clúster de ayuda del Explorador de datos de Azure que hemos configurado para facilitar el aprendizaje. Inicie sesión en el clúster con una cuenta de correo electrónico organizativa que sea miembro de Azure Active Directory.
En su propio clúster que incluye los datos de ejemplo de StormEvents. Para más información, consulte Inicio rápido: Creación de un clúster y una base de datos de Azure Data Explorer y Inicio rápido: Ingesta de datos de ejemplo en Azure Data Explorer.
El conjunto de datos de ejemplo de StormEvents contiene datos relacionados con el tiempo de los National Centers for Environmental Information.
Información general sobre el lenguaje de consulta
Una consulta en Azure Data Explorer es una solicitud de solo lectura para procesar los datos y devolver resultados. La solicitud se indica con un texto sin formato, mediante un modelo de flujo de datos diseñado para simplificar la lectura, creación y automatización de la sintaxis. La consulta usa entidades de esquema cuya organización es una jerarquía similar a SQL: bases de datos, tablas y columnas.
La consulta consta de una secuencia de instrucciones de consulta, delimitada por un punto y coma (;), con al menos una instrucción que será una instrucción de expresión tabular, que es una instrucción que genera datos organizados en una malla similar a una tabla de columnas y filas. Las instrucciones de expresión tabular de la consulta generan los resultados de la consulta.
La sintaxis de la instrucción de expresión tabular tiene un flujo de datos tabulares desde un operador de consulta tabular a otro, empezando por el origen de datos (por ejemplo, una tabla en una base de datos o un operador que genera datos) y, después, fluyendo a través de un conjunto de operadores de transformación de datos que están unidos mediante el uso del delimitador de canalización (|).
Por ejemplo, la siguiente consulta tiene una sola instrucción, que es una instrucción de expresión tabular. La instrucción se inicia con una referencia a una tabla denominada StormEvents (aquí la base de datos que hospeda esta tabla es implícita y forma parte de la información de conexión). Después, los datos (filas) de esa tabla se filtran por el valor de la columna StartTime y, luego, según el valor de la columna State. Después, la consulta devuelve el recuento de filas que "sobreviven".
[ Hagaclic para ejecutar la consulta]
StormEvents
| where StartTime >= datetime(2007-11-01) and StartTime < datetime(2007-12-01)
| where State == "FLORIDA"
| count
En este caso, el resultado es:
| Count |
|---|
| 23 |
Para más información, consulte la referencia de lenguaje de consulta.
Operadores más comunes
Los operadores tratados en esta sección son los bloques de creación para comprender las consultas en el Explorador de datos de Azure. La mayoría de las consultas que se escriben incluyen algunos de estos operadores.
Para ejecutar consultas en el clúster de ayuda, haga clic en Haga clic para ejecutar la consulta encima de cada consulta.
Para ejecutar consultas en su propio clúster:
Copie cada consulta en la aplicación de consulta basada en web y, después, seleccione la consulta o coloque el cursor en la consulta.
En la parte superior de la aplicación, haga clic en Ejecutar.
count
count: devuelve el recuento de filas de la tabla.
La siguiente consulta devuelve el recuento de filas de la tabla StormEvents.
[ Hagaclic para ejecutar la consulta]
StormEvents | count
take
take: devuelve al número especificado de filas de datos.
La siguiente consulta devuelve cinco filas de la tabla StormEvents. La palabra clave limit es un alias para take.
[ Hagaclic para ejecutar la consulta]
StormEvents | take 5
Sugerencia
No hay ninguna garantía de qué registros se devuelven a menos que se ordenen los datos de origen.
proyecto
project: selecciona un subconjunto de columnas.
La siguiente consulta devuelve un conjunto de columnas específico.
[ Hagaclic para ejecutar la consulta]
StormEvents
| take 5
| project StartTime, EndTime, State, EventType, DamageProperty, EpisodeNarrative
, donde
where: Filtra una tabla para el subconjunto de filas que cumplen un predicado.
La siguiente consulta filtra los datos por EventType y State.
[ Hagaclic para ejecutar la consulta]
StormEvents
| where EventType == 'Flood' and State == 'WASHINGTON'
| take 5
| project StartTime, EndTime, State, EventType, DamageProperty, EpisodeNarrative
sort
sort: Ordena las filas de la tabla de entrada en una o más columnas.
La siguiente consulta ordena los datos en orden descendente por DamageProperty.
[ Hagaclic para ejecutar la consulta]
StormEvents
| where EventType == 'Flood' and State == 'WASHINGTON'
| sort by DamageProperty desc
| take 5
| project StartTime, EndTime, State, EventType, DamageProperty, EpisodeNarrative
Nota
Es importante el orden de las operaciones. Intente colocar take 5 antes de sort by. ¿Obtiene resultados diferentes?
top
top: Devuelve los primeros N registros ordenados por las columnas especificadas.
La consulta siguiente devuelve los mismos resultados que anteriormente con un operador menos.
[ Hagaclic para ejecutar la consulta]
StormEvents
| where EventType == 'Flood' and State == 'WASHINGTON'
| top 5 by DamageProperty desc
| project StartTime, EndTime, State, EventType, DamageProperty, EpisodeNarrative
extend
extend: calcula las columnas derivadas.
La siguiente consulta crea una nueva columna calculando un valor en cada fila.
[ Hagaclic para ejecutar la consulta]
StormEvents
| where EventType == 'Flood' and State == 'WASHINGTON'
| top 5 by DamageProperty desc
| extend Duration = EndTime - StartTime
| project StartTime, EndTime, Duration, State, EventType, DamageProperty, EpisodeNarrative
Las expresiones pueden incluir todos los operadores habituales (+, -, *, /, %) y hay una amplia gama de funciones útiles a las que puede llamar.
summarize
summarize: incorpora grupos de filas.
La consulta siguiente devuelve el recuento de eventos por State.
[ Hagaclic para ejecutar la consulta]
StormEvents
| summarize event_count = count() by State
El operador summarize agrupa las filas que tienen los mismos valores en el cláusula by y, después, usa la función de agregación (como count) para combinar cada grupo en una sola fila. Por lo tanto, en este caso, hay una fila para cada estado y una columna para el recuento de filas de ese estado.
Hay una amplia gama de funciones de agregación y puede usar varias en un operador summarize para generar varias columnas calculadas. Por ejemplo, podría obtener el recuento de tormentas en cada estado y el número único de tormentas por estado, y luego usar top para obtener los estados más afectados por tormentas.
[ Hagaclic para ejecutar la consulta]
StormEvents
| summarize StormCount = count(), TypeOfStorms = dcount(EventType) by State
| top 5 by StormCount desc
El resultado de una operación summarize tiene:
Cada columna con nombre en by
Una columna para cada expresión calculada
Una fila para cada combinación de valores by
render
render: representa los resultados como una salida gráfica.
La consulta siguiente muestra un gráfico de columnas.
[ Hagaclic para ejecutar la consulta]
StormEvents
| summarize event_count=count(), mid = avg(BeginLat) by State
| sort by mid
| where event_count > 1800
| project State, event_count
| render columnchart
La consulta siguiente muestra un gráfico de tiempo simple.
[ Hagaclic para ejecutar la consulta]
StormEvents
| summarize event_count=count() by bin(StartTime, 1d)
| render timechart
La consulta siguiente cuenta los eventos por el módulo de tiempo de un día, discretizados en horas y muestra un gráfico de tiempo.
[ Hagaclic para ejecutar la consulta]
StormEvents
| extend hour = floor(StartTime % 1d , 1h)
| summarize event_count=count() by hour
| sort by hour asc
| render timechart
La siguiente consulta compara varias series diarias en un gráfico de tiempo.
[ Hagaclic para ejecutar la consulta]
StormEvents
| extend hour= floor( StartTime % 1d , 1h)
| where State in ("GULF OF MEXICO","MAINE","VIRGINIA","WISCONSIN","NORTH DAKOTA","NEW JERSEY","OREGON")
| summarize event_count=count() by hour, State
| render timechart
Nota
El operador render es una característica de lado cliente en lugar de parte del motor. Está integrado en el lenguaje para facilitar su uso. La aplicación web admite las siguientes opciones: barchart, columnchart, piechart, timechart y linechart.
Operadores escalares
Esta sección trata algunos de los operadores escalares más importantes.
bin()
bin(): Redondea los valores hacia abajo hasta un entero múltiplo del tamaño de un intervalo determinado.
La siguiente consulta calcula el número con un tamaño de depósito de un día.
[ Hagaclic para ejecutar la consulta]
StormEvents
| where StartTime > datetime(2007-02-14) and StartTime < datetime(2007-02-21)
| summarize event_count = count() by bin(StartTime, 1d)
case()
case(): evalúa una lista de predicados y devuelve la primera expresión de resultado cuyo predicado se cumpla o la última expresión else. Puede usar este operador para clasificar o agrupar los datos:
La consulta siguiente devuelve una columna deaths_bucket nueva y agrupa las muertes por número.
[ Hagaclic para ejecutar la consulta]
StormEvents
| summarize deaths = sum(DeathsDirect) by State
| extend deaths_bucket = case (
deaths > 50, "large",
deaths > 10, "medium",
deaths > 0, "small",
"N/A")
| sort by State asc
extract()
extract(): obtiene una coincidencia para una expresión regular a partir de una cadena determinada.
La siguiente consulta extrae los valores de atributo específicos de un seguimiento.
[ Hagaclic para ejecutar la consulta]
let MyData = datatable (Trace: string) ["A=1, B=2, Duration=123.45,...", "A=1, B=5, Duration=55.256, ..."];
MyData
| extend Duration = extract("Duration=([0-9.]+)", 1, Trace, typeof(real)) * time(1s)
Esta consulta usa una instrucción let, que enlaza un nombre (en este caso ) a una expresión. Para el resto del ámbito, en el que aparece la instrucción let (ámbito global o en un ámbito del cuerpo de función), se puede usar el nombre para hacer referencia a su valor enlazado.
parse_json()
parse_json(): interpreta una cadena como un valor JSON y devuelve el valor como dinámico. Es superior al uso de la función extractjson() cuando necesita extraer más de un elemento de un objeto JSON compuesto.
La siguiente consulta extrae los elementos JSON de una matriz.
[ Hagaclic para ejecutar la consulta]
let MyData = datatable (Trace: string)
['{"duration":[{"value":118.0,"valcount":5.0,"min":100.0,"max":150.0,"stdDev":0.0}]}'];
MyData
| extend NewCol = parse_json(Trace)
| project NewCol.duration[0].value, NewCol.duration[0].valcount, NewCol.duration[0].min, NewCol.duration[0].max, NewCol.duration[0].stdDev
La siguiente consulta extrae los elementos JSON.
[ Hagaclic para ejecutar la consulta]
let MyData = datatable (Trace: string) ['{"value":118.0,"valcount":5.0,"min":100.0,"max":150.0,"stdDev":0.0}'];
MyData
| extend NewCol = parse_json(Trace)
| project NewCol.value, NewCol.valcount, NewCol.min, NewCol.max, NewCol.stdDev
La siguiente consulta extrae los elementos JSON con un tipo de datos dinámico.
[ Hagaclic para ejecutar la consulta]
let MyData = datatable (Trace: dynamic)
[dynamic({"value":118.0,"counter":5.0,"min":100.0,"max":150.0,"stdDev":0.0})];
MyData
| project Trace.value, Trace.counter, Trace.min, Trace.max, Trace.stdDev
ago()
ago(): Resta un intervalo de tiempo especificado a la hora UTC actual.
La siguiente consulta devuelve los datos de las últimas 12 horas.
[ Hagaclic para ejecutar la consulta]
//The first two lines generate sample data, and the last line uses
//the ago() operator to get records for last 12 hours.
print TimeStamp= range(now(-5d), now(), 1h), SomeCounter = range(1,121)
| mv-expand TimeStamp, SomeCounter
| where TimeStamp > ago(12h)
startofweek()
startofweek(): devuelve el inicio de la semana que contiene la fecha, desplazada por un desplazamiento, si se proporciona.
La siguiente consulta devuelve el inicio de la semana con desplazamientos diferentes.
[ Hagaclic para ejecutar la consulta]
range offset from -1 to 1 step 1
| project weekStart = startofweek(now(), offset),offset
Esta consulta usa el operador range, que genera una tabla de valores de una sola columna. Vea también: startofday(), startofweek(), startofyear()), startofmonth(), endofday(), endofweek(), endofmonth() y endofyear().
between()
between(): coincide con la entrada que está dentro del intervalo inclusivo.
La siguiente consulta filtra los datos por un intervalo de fecha determinado.
[ Hagaclic para ejecutar la consulta]
StormEvents
| where StartTime between (datetime(2007-07-27) .. datetime(2007-07-30))
| count
La siguiente consulta filtra los datos según un intervalo de fechas determinado, con una ligera variación de tres días (3d) desde la fecha de inicio.
[ Hagaclic para ejecutar la consulta]
StormEvents
| where StartTime between (datetime(2007-07-27) .. 3d)
| count
Operadores tabulares
Kusto tiene muchos operadores tabulares, algunos de los cuales se tratan en otras secciones de este artículo. Aquí nos centraremos en parse.
parse
parse: evalúa una expresión de cadena y analiza su valor en una o más columnas calculadas. Hay tres maneras de analizar: simple (el valor predeterminado), regex y relajado.
La siguiente consulta analiza un seguimiento y extrae los valores pertinentes, con un valor predeterminado de un análisis simple. La expresión (denominada StringConstant) es un valor de cadena regular y la coincidencia es estricta: las columnas extendidas deben coincidir con los tipos necesarios.
[ Hagaclic para ejecutar la consulta]
let MyTrace = datatable (EventTrace:string)
[
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=23, lockTime=02/17/2016 08:40:01Z, releaseTime=02/17/2016 08:40:01Z, previousLockTime=02/17/2016 08:39:01Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=15, lockTime=02/17/2016 08:40:00Z, releaseTime=02/17/2016 08:40:00Z, previousLockTime=02/17/2016 08:39:00Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=20, lockTime=02/17/2016 08:40:01Z, releaseTime=02/17/2016 08:40:01Z, previousLockTime=02/17/2016 08:39:01Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=22, lockTime=02/17/2016 08:41:01Z, releaseTime=02/17/2016 08:41:00Z, previousLockTime=02/17/2016 08:40:01Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=16, lockTime=02/17/2016 08:41:00Z, releaseTime=02/17/2016 08:41:00Z, previousLockTime=02/17/2016 08:40:00Z)'
];
MyTrace
| parse EventTrace with * "resourceName=" resourceName ", totalSlices=" totalSlices:long * "sliceNumber=" sliceNumber:long * "lockTime=" lockTime ", releaseTime=" releaseTime:date "," * "previousLockTime=" previouLockTime:date ")" *
| project resourceName ,totalSlices , sliceNumber , lockTime , releaseTime , previouLockTime
La siguiente consulta analiza un seguimiento y extrae los valores pertinentes mediante kind = regex. StringConstant puede ser una expresión regular.
[ Hagaclic para ejecutar la consulta]
let MyTrace = datatable (EventTrace:string)
[
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=23, lockTime=02/17/2016 08:40:01Z, releaseTime=02/17/2016 08:40:01Z, previousLockTime=02/17/2016 08:39:01Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=15, lockTime=02/17/2016 08:40:00Z, releaseTime=02/17/2016 08:40:00Z, previousLockTime=02/17/2016 08:39:00Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=20, lockTime=02/17/2016 08:40:01Z, releaseTime=02/17/2016 08:40:01Z, previousLockTime=02/17/2016 08:39:01Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=22, lockTime=02/17/2016 08:41:01Z, releaseTime=02/17/2016 08:41:00Z, previousLockTime=02/17/2016 08:40:01Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=16, lockTime=02/17/2016 08:41:00Z, releaseTime=02/17/2016 08:41:00Z, previousLockTime=02/17/2016 08:40:00Z)'
];
MyTrace
| parse kind = regex EventTrace with "(.*?)[a-zA-Z]*=" resourceName @", totalSlices=\s*\d+\s*.*?sliceNumber=" sliceNumber:long ".*?(previous)?lockTime=" lockTime ".*?releaseTime=" releaseTime ".*?previousLockTime=" previousLockTime:date "\\)"
| project resourceName , sliceNumber , lockTime , releaseTime , previousLockTime
La siguiente consulta analiza un seguimiento y extrae los valores pertinentes mediante kind = relaxed. StringConstant es un valor de cadena regular y la coincidencia es relajada: las columnas extendidas pueden coincidir parcialmente con los tipos necesarios.
[ Hagaclic para ejecutar la consulta]
let MyTrace = datatable (EventTrace:string)
[
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=23, lockTime=02/17/2016 08:40:01Z, releaseTime=02/17/2016 08:40:01Z, previousLockTime=02/17/2016 08:39:01Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=15, lockTime=02/17/2016 08:40:00Z, releaseTime=02/17/2016 08:40:00Z, previousLockTime=02/17/2016 08:39:00Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=20, lockTime=02/17/2016 08:40:01Z, releaseTime=02/17/2016 08:40:01Z, previousLockTime=02/17/2016 08:39:01Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=22, lockTime=02/17/2016 08:41:01Z, releaseTime=02/17/2016 08:41:00Z, previousLockTime=02/17/2016 08:40:01Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=16, lockTime=02/17/2016 08:41:00Z, releaseTime=02/17/2016 08:41:00Z, previousLockTime=02/17/2016 08:40:00Z)'
];
MyTrace
| parse kind=relaxed "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=NULL, sliceNumber=23, lockTime=02/17/2016 08:40:01, releaseTime=NULL, previousLockTime=02/17/2016 08:39:01)" with * "resourceName=" resourceName ", totalSlices=" totalSlices:long * "sliceNumber=" sliceNumber:long * "lockTime=" lockTime ", releaseTime=" releaseTime:date "," * "previousLockTime=" previousLockTime:date ")" *
| project resourceName ,totalSlices , sliceNumber , lockTime , releaseTime , previousLockTime
Análisis de series temporales
make-series
make-series: agrupa los grupos de filas como summarize, pero genera un vector de serie (temporal) por cada combinación de valores.
La siguiente consulta devuelve un conjunto de series temporales para el recuento de eventos de tormentas al día. La consulta abarca un período de tres meses para cada estado, y rellena los intervalos que faltan con la constante 0:
[ Hagaclic para ejecutar la consulta]
StormEvents
| make-series n=count() default=0 on StartTime in range(datetime(2007-01-01), datetime(2007-03-31), 1d) by State
Una vez que cree un conjunto de serie (temporal), puede aplicar funciones de la serie para detectar formas anómalas, patrones estacionales y mucho más.
La siguiente consulta extrae los tres estados principales que tenían la mayoría de los eventos en un día específico:
[ Hagaclic para ejecutar la consulta]
StormEvents
| make-series n=count() default=0 on StartTime in range(datetime(2007-01-01), datetime(2007-03-31), 1d) by State
| extend series_stats(n)
| top 3 by series_stats_n_max desc
| render timechart
Para más información, revise la lista completa de funciones de serie.
Agregaciones avanzadas
Se tratan como agregaciones básicas, como count y summarize, anteriormente en este artículo. Esta sección presenta opciones más avanzadas.
top-nested
top-nested: genera los principales resultados jerárquicos, donde cada nivel es un desglose según los valores de niveles anteriores.
Este operador es útil para escenarios de visualización del panel, o cuando es necesario que responda una pregunta similar a la siguiente: "Encontrar los valores principales de N de K1 (mediante la agregación); para cada uno de ellos, buscar cuáles son los valores principales de M de K2 (mediante otra agregación); ..."
La siguiente consulta devuelve una tabla jerárquica con State en el nivel superior, seguido por Sources.
[ Hagaclic para ejecutar la consulta]
StormEvents
| top-nested 2 of State by sum(BeginLat),
top-nested 3 of Source by sum(BeginLat),
top-nested 1 of EndLocation by sum(BeginLat)
complemento pivot()
complemento pivot(): gira una tabla convirtiendo los valores únicos de una columna de la tabla de entrada en varias columnas de la tabla de salida. El operador realiza agregaciones donde sea necesario en cualquier valor de columna restante en la salida final.
La siguiente consulta aplica un filtro y cambia las filas a columnas.
[ Hagaclic para ejecutar la consulta]
StormEvents
| project State, EventType
| where State startswith "AL"
| where EventType has "Wind"
| evaluate pivot(State)
dcount()
dcount(): devuelve una estimación del número de valores distintos de una expresión en el grupo. Use count() para contar todos los valores.
La consulta siguiente cuenta distintos Source por State.
[ Hagaclic para ejecutar la consulta]
StormEvents
| summarize Sources = dcount(Source) by State
dcountif()
dcountif(): devuelve una estimación del número de valores distintos de la expresión de filas para las que el predicado se evalúa en true.
La siguiente consulta cuenta los valores distintos de Source donde DamageProperty < 5000.
[ Hagaclic para ejecutar la consulta]
StormEvents
| take 100
| summarize Sources = dcountif(Source, DamageProperty < 5000) by State
dcount_hll()
dcount_hll(): Calcula el valor de dcount de los resultados de HyperLogLog (generados por hll o hll_merge.
La consulta siguiente usa el algoritmo HLL para generar el recuento.
[ Hagaclic para ejecutar la consulta]
StormEvents
| summarize hllRes = hll(DamageProperty) by bin(StartTime,10m)
| summarize hllMerged = hll_merge(hllRes)
| project dcount_hll(hllMerged)
arg_max()
arg_max(): busca una fila en el grupo que maximice una expresión y devuelve el valor de otra expresión (o * para devolver toda la fila).
La consulta siguiente devuelve la hora del último informe de inundación en cada estado.
[ Hagaclic para ejecutar la consulta]
StormEvents
| where EventType == "Flood"
| summarize arg_max(StartTime, *) by State
| project State, StartTime, EndTime, EventType
makeset()
makeset(): devuelve una matriz dinámica (JSON) del conjunto de valores distintos que una expresión toma en el grupo.
La consulta siguiente devuelve todas las veces que se informó de una inundación en cada estado y crea una matriz del conjunto de valores distintos.
[ Hagaclic para ejecutar la consulta]
StormEvents
| where EventType == "Flood"
| summarize FloodReports = makeset(StartTime) by State
| project State, FloodReports
mv-expand
mv-expand: expande las colecciones de varios valores de una columna de tipo dinámico para que cada valor de la colección obtenga una fila independiente. Todas las demás columnas de una fila expandida se duplican. Es lo contrario de makelist.
La siguiente consulta genera datos de ejemplo creando un conjunto y, después, usándolo para demostrar las capacidades de mv-expand.
[ Hagaclic para ejecutar la consulta]
let FloodDataSet = StormEvents
| where EventType == "Flood"
| summarize FloodReports = makeset(StartTime) by State
| project State, FloodReports;
FloodDataSet
| mv-expand FloodReports
percentiles()
percentiles(): devuelve una estimación para el percentil del intervalo más cercano especificado de la población definida por una expresión. La precisión depende de la densidad de población en la región del percentil. Se puede usar únicamente en el contexto de agregación dentro de summarize.
La siguiente consulta calcula los percentiles de duración de tormentas.
[ Hagaclic para ejecutar la consulta]
StormEvents
| extend duration = EndTime - StartTime
| where duration > 0s
| where duration < 3h
| summarize percentiles(duration, 5, 20, 50, 80, 95)
La siguiente consulta calcula los percentiles de duración de tormentas por estado y normaliza los datos en intervalos de cinco minutos (5m).
[ Hagaclic para ejecutar la consulta]
StormEvents
| extend duration = EndTime - StartTime
| where duration > 0s
| where duration < 3h
| summarize event_count = count() by bin(duration, 5m), State
| summarize percentiles(duration, 5, 20, 50, 80, 95) by State
Conjunto de datos cruzado
Esta sección trata los elementos que le permiten crear consultas más complejas, combinar los datos entre tablas y consultas entre bases de datos y clústeres.
let
let: mejora la modularidad y la reutilización. La instrucción let le permite dividir una expresión potencialmente compleja en varias partes, cada una enlazada a un nombre y recomponer dichas partes. Una instrucción let también puede usarse para crear funciones y vistas definidas por el usuario (expresiones a través de las tablas cuyos resultados tienen el aspecto de una tabla nueva). Las expresiones enlazadas por una instrucción let puede ser de tipo escalar, de tipo tabular o una función definida por el usuario (expresiones lambda).
El ejemplo siguiente crea una variable de tipo tabular y la usa en una expresión posterior.
[ Hagaclic para ejecutar la consulta]
let LightningStorms =
StormEvents
| where EventType == "Lightning";
let AvalancheStorms =
StormEvents
| where EventType == "Avalanche";
LightningStorms
| join (AvalancheStorms) on State
| distinct State
join
join: combina las filas de dos tablas para formar una nueva tabla haciendo coincidir los valores de las columnas especificadas de cada tabla. Kusto admite una amplia gama de tipos de combinaciones: fullouter, inner, innerunique, leftanti, leftantisemi, leftouter, leftsemi, rightanti, rightantisemi, rightouter y rightsemi.
El ejemplo siguiente combina dos tablas con una combinación interna.
[ Hagaclic para ejecutar la consulta]
let X = datatable(Key:string, Value1:long)
[
'a',1,
'b',2,
'b',3,
'c',4
];
let Y = datatable(Key:string, Value2:long)
[
'b',10,
'c',20,
'c',30,
'd',40
];
X
| join kind=inner Y on Key
Sugerencia
Use los operadores where y project para reducir el número de filas y columnas en las tablas de entrada antes de la combinación. Si una tabla siempre es menor que la otro, úsela como lado izquierdo (canalizado) de la combinación. Las columnas para la coincidencia de la combinación tienen que tener el mismo nombre. Use el operador project si es necesario cambiar el nombre de una columna en una de las tablas.
serialize
serialize: serializa el conjunto de filas para que pueda usar las funciones que requieren datos serializados, como row_number() .
La siguiente consulta se realiza correctamente porque los datos están serializados.
[ Hagaclic para ejecutar la consulta]
StormEvents
| summarize count() by State
| serialize
| extend row_number = row_number()
El conjunto de filas también se considera como serializado si es el resultado de: operadores sort, top o range, seguidos opcionalmente por operadores project, project-away, extend, where, parse, mv-expand o take.
[ Hagaclic para ejecutar la consulta]
StormEvents
| summarize count() by State
| sort by State asc
| extend row_number = row_number()
Consultas entre bases de datos y entre clústeres
Consultas entre bases de datos y entre clústeres:puede consultar una base de datos en el mismo clúster haciendo referencia a ella como . Puede consultar una base de datos en un clúster remoto haciendo referencia a él como cluster("MyCluster").database("MyDatabase").MyTable.
Se llama a la consulta siguiente desde un clúster y consulta los datos del clúster MyCluster. Para ejecutar esta consulta, use su propio nombre de clúster y nombre de base de datos.
cluster("MyCluster").database("Wiki").PageViews
| where Views < 2000
| take 1000;
Análisis de usuario
Esta sección incluye elementos y consultas que muestran lo fácil que es realizar un análisis de comportamientos de usuarios en Kusto.
complemento activity_counts_metrics
complemento activity_counts_metrics: calcula las métricas de actividad útiles (valores de recuento total, valores de recuento distintos, recuento distinto de valores nuevos y recuento distinto agregado). Las métricas se calculan para cada ventana temporal y luego se comparan y se agregan y con todas las ventanas temporales.
La siguiente consulta analiza la adopción por parte del usuario calculando los recuentos de actividad diaria.
[ Hagaclic para ejecutar la consulta]
let start=datetime(2017-08-01);
let end=datetime(2017-08-04);
let window=1d;
let T = datatable(UserId:string, Timestamp:datetime)
[
'A', datetime(2017-08-01),
'D', datetime(2017-08-01),
'J', datetime(2017-08-01),
'B', datetime(2017-08-01),
'C', datetime(2017-08-02),
'T', datetime(2017-08-02),
'J', datetime(2017-08-02),
'H', datetime(2017-08-03),
'T', datetime(2017-08-03),
'T', datetime(2017-08-03),
'J', datetime(2017-08-03),
'B', datetime(2017-08-03),
'S', datetime(2017-08-03),
'S', datetime(2017-08-04),
];
T
| evaluate activity_counts_metrics(UserId, Timestamp, start, end,
window)
complemento activity_engagement
complemento activity_engagement: calcula la proporción de interacción de actividad según la columna de identificador a través de una ventana deslizante de escala de tiempo. El complemento activity_engagement puede usarse para calcular los DAU, WAU y MAU (usuarios activos diariamente, semanalmente y mensualmente).
La consulta siguiente devuelve la proporción de usuarios distintos totales que usan una aplicación en comparación con los usuarios distintos totales que usan la aplicación cada semana, en una ventana móvil de siete días.
[ Hagaclic para ejecutar la consulta]
// Generate random data of user activities
let _start = datetime(2017-01-01);
let _end = datetime(2017-01-31);
range _day from _start to _end step 1d
| extend d = tolong((_day - _start)/1d)
| extend r = rand()+1
| extend _users=range(tolong(d*50*r), tolong(d*50*r+100*r-1), 1)
| mv-expand id=_users to typeof(long) limit 1000000
// Calculate DAU/WAU ratio
| evaluate activity_engagement(['id'], _day, _start, _end, 1d, 7d)
| project _day, Dau_Wau=activity_ratio*100
| render timechart
Sugerencia
Al calcular los DAU o MAU, cambian los datos finales y el período de ventana móvil (OuterActivityWindow).
complemento activity_metrics
complemento activity_metrics: calcula las métricas de actividad útiles (valores de recuento distintos, recuento distinto de valores nuevos, tasa de retención y tasa de renovación) según la ventana del período actual frente a la ventana del período anterior.
La siguiente consulta calcula la tasa de renovación y retención para un determinado conjunto de datos.
[ Hagaclic para ejecutar la consulta]
// Generate random data of user activities
let _start = datetime(2017-01-02);
let _end = datetime(2017-05-31);
range _day from _start to _end step 1d
| extend d = tolong((_day - _start)/1d)
| extend r = rand()+1
| extend _users=range(tolong(d*50*r), tolong(d*50*r+200*r-1), 1)
| mv-expand id=_users to typeof(long) limit 1000000
| where _day > datetime(2017-01-02)
| project _day, id
// Calculate weekly retention rate
| evaluate activity_metrics(['id'], _day, _start, _end, 7d)
| project _day, retention_rate*100, churn_rate*100
| render timechart
complemento new_activity_metrics
complemento new_activity_metrics: calcula las métricas de actividad útiles (valores de recuento distintos, recuento distinto de valores nuevos, tasa de retención y tasa de renovación) para la cohorte de usuarios nuevos. El concepto de este complemento es similar a complemento activity_metrics, pero se centra en los nuevos usuarios.
La siguiente consulta calcula una tasa de retención y renovación con una ventana de semana tras semana para la cohorte de nuevos usuarios (usuarios que llegaron la primera semana).
[ Hagaclic para ejecutar la consulta]
// Generate random data of user activities
let _start = datetime(2017-05-01);
let _end = datetime(2017-05-31);
range Day from _start to _end step 1d
| extend d = tolong((Day - _start)/1d)
| extend r = rand()+1
| extend _users=range(tolong(d*50*r), tolong(d*50*r+200*r-1), 1)
| mv-expand id=_users to typeof(long) limit 1000000
// Take only the first week cohort (last parameter)
| evaluate new_activity_metrics(['id'], Day, _start, _end, 7d, _start)
| project from_Day, to_Day, retention_rate, churn_rate
complemento session_count
complemento session_count: calcula el recuento de sesiones según la columna de identificador en una escala de tiempo.
La consulta siguiente devuelve el recuento de sesiones. Una sesión se considera activa si un identificador de usuario aparece al menos una vez en un período de tiempo 100 espacios de tiempo, mientras que la ventana de retroceso de sesión es 41 espacios de tiempo.
[ Hagaclic para ejecutar la consulta]
let _data = range Timeline from 1 to 9999 step 1
| extend __key = 1
| join kind=inner (range Id from 1 to 50 step 1 | extend __key=1) on __key
| where Timeline % Id == 0
| project Timeline, Id;
// End of data definition
_data
| evaluate session_count(Id, Timeline, 1, 10000, 100, 41)
| render linechart
complemento funnel_sequence
complemento funnel_sequence: calcula el recuento distinto de usuarios que han adoptado una secuencia de estados; muestra la distribución de los estados anteriores y siguientes a los que ha llevado la secuencia o que esta ha seguido.
La consulta siguiente muestra qué evento se produce antes y después de todos los eventos de tornados de 2007.
[ Hagaclic para ejecutar la consulta]
// Looking on StormEvents statistics:
// Q1: What happens before Tornado event?
// Q2: What happens after Tornado event?
StormEvents
| evaluate funnel_sequence(EpisodeId, StartTime, datetime(2007-01-01), datetime(2008-01-01), 1d,365d, EventType, dynamic(['Tornado']))
complemento funnel_sequence_completion
complemento funnel_sequence_completion: calcula el embudo de los pasos de la secuencia completados dentro de diferentes períodos de tiempo.
La consulta siguiente comprueba el embudo de finalización de la secuencia: Hail -> Tornado -> Thunderstorm -> Wind en momentos "generales" de una hora, cuatro horas y un día ([1h, 4h, 1d]).
[ Hagaclic para ejecutar la consulta]
let _start = datetime(2007-01-01);
let _end = datetime(2008-01-01);
let _windowSize = 365d;
let _sequence = dynamic(['Hail', 'Tornado', 'Thunderstorm', 'Wind']);
let _periods = dynamic([1h, 4h, 1d]);
StormEvents
| evaluate funnel_sequence_completion(EpisodeId, StartTime, _start, _end, _windowSize, EventType, _sequence, _periods)
Functions
Esta sección trata las funciones: consultas reutilizables que se almacenan en el servidor. Las consultas y otras funciones pueden invocar funciones (no se admiten las funciones recursivas).
Nota
No puede crear funciones en el clúster de ayuda, que es de solo lectura. Use su propio clúster de prueba para esta parte.
En el ejemplo siguiente se crea una función que toma un nombre de estado (MyState) como argumento.
.create function with (folder="Demo")
MyFunction (MyState: string)
{
StormEvents
| where State =~ MyState
}
El ejemplo siguiente llama a una función que obtiene los datos del estado de Texas.
MyFunction ("Texas")
| summarize count()
El ejemplo siguiente elimina la función que se creó en el primer paso.
.drop function MyFunction