2016-02-10 4 views
0

В графите я храню много метрических данных временного ряда. Предположим, у меня есть 2 разных показателя X и Y, которые представляют цены двух разных продуктов.Предложение «Где» с графитовыми запросами

Я хотел бы теперь запросить данные из приложения и сделать что-то вроде этого (конечно, это псевдо-SQL):

Select all points of metric X where value is smaller than value of metric Y during a time frame 

Я не мог найти какой-либо разумный способ, без написания моего собственный скрипт или какую-нибудь работу по уменьшению количества карт, чтобы сделать это.

Я мог бы, например, построить график и попытаться понять его визуально довольно легко. Но приложение не будет использоваться для использования.

Я также думал об использовании некоторых функций, таких как currentBelow и currentAbove, но это не похоже, что я могу предоставить две разные серии для сравнения, но только одно конкретное целое число за весь период времени.

+0

Не извлечения обоих показателей и сравнение их в сценарии возможной ? Решение @kwarunek ниже выглядит правильно, но я не знаю, рассчитывается ли его «сложность», или даже если это быстрее, чем делать вычисления вручную в вашем скрипте. – dukebody

+0

@dukebody - Это именно то, что мне интересно. Я пытаюсь выяснить, есть ли способ, который я не совсем понимаю, для запроса графита для такого сложного запроса вместо написания скриптов. Если нет, я увижу, что лучше окупается - сценарий предоставленного ответа. – Avi

ответ

2

Отказ от ответственности: Я надеюсь, что есть лучшее решение;).

Решение:

Метрики:

product.X.price 
product.Y.price 
  1. создают маску фильтра - значения 0 не больше, 1 больше

    1. diffSeries - установить границу 0 - над точками, которые мы хотим включить, ниже, чтобы исключить.

      diffSeries(product.X.price, product.Y.price) 
      
    2. removeBelowValue - удалить все Исключен - ниже 0,

      removeBelowValue(diffSeries(product.X.price, product.Y.price), 0) 
      
    3. divideSeries - разделяй выше серии сама по себе, чтобы создать маску из 0 и 1 - к счастью, в функции графита в 0/0 = 0 (так!),

      divideSeries(removeBelowValue(diffSeries(product.X.price, product.Y.price), 0), removeBelowValue(diffSeries(product.X.price, product.Y.price), 0)) 
      
  2. отфильтровывать с помощью приготовленную маску с multiplySeries, так как

    0 * = точки данных 0

    1 * DataPoint = DataPoint

    multiplySeries(product.X.price, divideSeries(removeBelowValue(diffSeries(product.X.price, product.Y.price), 0), removeBelowValue(diffSeries(product.X.price, product.Y.price), 0))) 
    
+0

Я также надеюсь, что есть лучшее решение, но я попытался подумать, как понять это из существующих функций, используя Graphite, и то, что вы сделали, выглядит потрясающе! Если нет лучшего решения, я рад видеть, что он разрешимый. Мне все же нужно получить детали, которые я выяснил для себя, чтобы убедиться, что это работает, а также немного подождать и посмотреть, придет ли более простое решение. Поэтому я отвечу на ответ через 2-3 дня. Благодарю вас в любом случае! – Avi

Смежные вопросы