recursion: cree un árbol/ejecute una consulta recursiva en Kusto Azure Data Explorer

CorePress2024-01-24  10

Tengo una tabla de Kusto que tiene la siguiente estructura:

Nombre Archivo Tipo de ingesta A F1 producción B F1 aporte B F2 producción C F2 aporte D F2 aporte

Quiero comenzar con un nombre determinado, decir A y ejecutar una consulta donde pueda construir un árbol plano hasta un cierto nivel. Hasta ahora mi solución es escribir una consulta para cada nivel y unir los datos al final:

    let parent = table | where Name == 'A';
    let child_level_1 = table | where type == 'input' 
    | join kind=inner parent on File
    | ... // project own output logic for child_level_2 to consume
    let child_level_2 = table | where type == 'input'
    | join kind=inner child_level_1 on File
    ...
    let child_level_10 = ...

¿Se podría construir dinámicamente lo anterior en Kusto? Algo como "mientras los niños tienen resultados consumidos por otros, sigue consultando"

Entonces Kusto no tiene¿Algo correspondiente a expresiones de tabla comunes recursivas en SQL (CON RECURSIVO)? En realidad, tienen nombres incorrectos: son iterativos en lugar de recursivos, pero sirven para el mismo propósito.

- Craig Ringer

7 de agosto de 2023 a las 2:37



------------------------------------

¿Se podría construir dinámicamente lo anterior en Kusto? Algo como "mientras los niños tienen resultados consumidos por otros, sigue consultando"

No. Lo que escribiste arriba (usando child_level_i) es la única manera.



------------------------------------

Editar

Kusto ahora admite gráficos dirigidos, lo que le permitiría lograr lo que desea al crear un árbol de procesos y luego filtrar las ramas. https://learn.microsoft.com/en-us/azure/data-explorer/kusto/query/graph-operators

Echa un vistazo allí: https://github.com/microsoft/Kusto-Query-Language/issues/133#issuecomment-1868939619

Vieja forma

Si está buscando una rama de proceso en particular, puede seleccionarla definiendo el árbol de procesos como una secuencia temporal de procesos iniciados o líneas de comando con el complemento de evaluación de secuencia_detect.

datatable (Time: datetime, parent:string, child: string)[
    '2023-01-13T14:01:06.3120799Z', "Grand parent", "parent",
    '2023-01-13T14:01:07.3120799Z', "parent", "child",
    '2023-01-13T14:01:08.3120799Z', "child", "grand child",
    '2023-01-13T14:01:08.3120799Z', "noise parent", "noise child"
    '2023-01-13T14:01:08.3120799Z', "noise child", "noise grandchild"
    ]
| evaluate sequence_detect(Time, // time column to look for sequence
                            3s, // timespan  allowed for the sequence completion
                            2s, // max timespan between each step
                           // process tree as condition
                           GrandParentFound =  parent == "Grand parent" and child == "parent",
                            ParentFound = parent == "parent" and child == "child",
                            ChildFound = parent == "child" and child == "grand child"
                            )

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare