Traducir un group by dentro de otro group by para obtener averages


(Ricardo Martin Buquet) #1

No estoy pudiendo encontrar la solucion para algo que parece simple. Estoy traduciendo una busqueda de splunk que hace lo siguiente
| bucket _time span=1s | stats count by _time marca operacion | stats min(count) as min,
max(count) as max by marca operacion

Pero al haber dos "by", que seria similar a un group by, no puedo obtener el average minimo por operacion por marca. Esto se ejecuta en un lapso de 5 minutos. De momento mis aggregations lucen asi

{
  "aggs": {
    "tps": {
      "date_histogram": {
        "field": "@timestamp",
        "interval": "1s"
      }
    },
    "marca": {
      "terms": {
        "field": "marca",
        "size": 100
      },
      "aggs": {
        "operacion": {
          "filters": {
            "other_bucket_key": "marcaDos",
            "filters": {
              "marcaUno": {
                "exists": {
                  "field": "marcaUno"
                }
              }
            }
          }
        }
      }
    }
  }
}

(Gabriel Moskovicz) #2

Hola!

Las agregaciones pueden ser en paralelo o hacia adentro. Entonces asi como tps y marca estan en paralelo, a dentro de marca podrias poner dos agregaciones.

De todas maneras estas bien rumbeado. bucket_time es Date Histogram, stats count es Terms, y luego min y max serian dos Terms con size 1, pero uno sort ascendente y el otro descendente. Entonces ahi podrias encontrar el maximo y minimo para esa operación si es que entiendo bien lo que estabas haciendo en splunk.

Saludos!
--Gabriel


(Ricardo Martin Buquet) #3

Gracias por tu respuesta. Lo resolvi de esta manera. Pero como me comentas esto del order no se si esta bien mi solucion!, Me podes decir si ves algo raro?, son mas las cosas q necesito mas alla de min y max, como average y percentiles 50, 90 y 99

{
  "size": 0,
  "query": {...},
  "aggs": {
    "brands": {
      "terms": {
        "field": "marca",
        "size": 100
      },
      "aggs": {
        "operation": {
          "filters": {
            "other_bucket_key": "marcaDos",
            "filters": {
              "marcaUno": {
                "exists": {
                  "field": "marcaUno"
                }
              }
            }
          },
          "aggs": {
            "documentosPorSegundo": {
              "date_histogram": {
                "field": "@timestamp",
                "interval": "1s"
              }
            },
            "min": {
              "min_bucket": {
                "buckets_path": "documentosPorSegundo>_count"
              }
            },
            "max": {
              "max_bucket": {
                "buckets_path": "documentosPorSegundo>_count"
              }
            },
            "avg": {
              "avg_bucket": {
                "buckets_path": "documentosPorSegundo>_count"
              }
            }
          }
        }
      }
    }
  }
}

(Gabriel Moskovicz) #4

Creo que aqui tienes que poner el exists como root del aggregation, y luego hacer el terms aggregation por marca. Tener en cuenta que aqui estarias encontrando el minimo y maximo de los top 100 documentos no de todo tu data set. Pero me parece que esto esta correcto tambien!


(system) #5

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.