Использование агрегации Javascript в запросах друидов - PullRequest
0 голосов
/ 06 июля 2018

Я пытаюсь написать агрегатор javascript для моих запросов друидов. мне нужно рассчитать среднее значение показателя "Base_SalesRank".
До сих пор я был в состоянии это написать:

 {
   "queryType": "groupBy",
   "dataSource": "marketdata",
   "granularity": "all",

   "dimensions" : ["Item"],
   "filter": { "type": "and", "fields" : [{"type": "selector", "dimension": "Item", "value": "MN10CESWW"}]},
   "intervals": ["2018-06-28T00:00Z/2018-07-04T00:00Z"],
  "aggregations" : [
    { "type" : "count", "name" : "rows" },
    { "type" : "doubleSum", "name" : "Base_SalesRank", "fieldName" : "Base_SalesRank" }
  ],
  "postAggregations" : [{
   "type": "javascript",
  "name": "Target DOS Average",
  "fieldNames": ["Base_SalesRank", "rows"],
    "function": "function(Base_SalesRank, rows) {return Base_SalesRank/ rows;}" 
  }]
}

Но я заметил, что многие значения в Base_SalesRank равны 0.

[ { 
  "timestamp" : "2018-06-28T05:06:03.000Z",
  "result" : {
    "pagingIdentifiers" : {
      "marketdata_2018-06-28T00:00:00.000Z_2018-06-29T00:00:00.000Z_2018-07-06T08:11:02.499Z" : 3
    },
    "dimensions" : [ "Item" ],
    "metrics" : [ "Base_SalesRank" ],
    "events" : [ {
      "segmentId" : "marketdata_2018-06-28T00:00:00.000Z_2018-06-29T00:00:00.000Z_2018-07-06T08:11:02.499Z",
      "offset" : 0,
      "event" : {
        "timestamp" : "2018-06-28T07:10:02.000Z",
        "Item" : "MN10CESWW",
        "Base_SalesRank" : 0
      }
    },
 {
      "segmentId" : "marketdata_2018-06-28T00:00:00.000Z_2018-06-29T00:00:00.000Z_2018-07-06T08:11:02.499Z",
      "offset" : 3,
      "event" : {
        "timestamp" : "2018-06-28T07:20:21.000Z",
        "Item" : "MN10CESWW",
        "Base_SalesRank" : 5558
      }
    } ]
  }
} ]

Так что я не получаю истинное среднее Теперь мне нужно отсеять эти 0 значений, а затем вычислить среднее значение. Мы можем сделать это с помощью фильтров

{"type": "not", "field": {"type": "selector", "dimension": "Base_SalesRank", "value": "0"}}

Но у меня есть ограничение, что я должен выполнять эту операцию фильтра только внутри функции javascript.

1 Ответ

0 голосов
/ 06 июля 2018

То же самое можно сделать, просто добавив запрос -

"having": {
    "type": "greaterThan",
    "aggregation": "Base_SalesRank",
    "value": 0
  }

Если вы хотите сделать то же самое в функции JavaScript, чем это можно сделать, как показано ниже -

  1. Вы должны добавить измерение (ключ / значение), скажем, "isValid" как "0" или "1" во время данных json перед приемом данных, основываясь на том, что если Base_SalesRank равен 0, то "isValid" будет 0 или 1. 1. 1007 *
  2. Применить фильтр к этому полю в вашем запросе.

  3. Используйте строки в своем посте Агрегирование.

...