带有石墨查询的'where'子句

时间:2016-02-10 11:05:31

标签: mapreduce graphite bigdata

我在石墨中持有大量的时间序列度量数据。假设我有2个不同的指标 X Y ,它们代表两种不同产品的价格。

我现在想查询应用程序中的数据并执行类似的操作(当然,这是伪sql):

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

我没有找到任何合理的方法,没有编写我自己的脚本或一些map-reduce工作,就可以做到。

例如,我可以绘制图形并尝试在视觉上很容易理解它。但它不适用于应用程序。

我还想过使用像currentBelowcurrentAbove这样的函数,但看起来我不能提供两个不同的系列来比较,但在整个时间段内只能提供一个特定的整数。 / p>

1 个答案:

答案 0 :(得分: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(sic!),

      divideSeries(removeBelowValue(diffSeries(product.X.price, product.Y.price), 0), removeBelowValue(diffSeries(product.X.price, product.Y.price), 0))
      
  2. 使用准备好的掩码过滤掉multiplySeries,因为

    0 * datapoint = 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)))