计算HIVE中的指数移动平均值

时间:2014-09-15 19:12:05

标签: sql hive

我试图计算蜂巢中的指数平均值。 对于EMA,它是 EMA =(K *(C-P))+ P其中K是平滑因子,假设它是0.5。 C是当前值,p是先前值。如果表格如下表所示:

ID    Value        Date
1      10         2010-05-03
2      15         2010-05-06
3      17         2010-05-13

EMA应该是:

ID     EMA                             Date
1      10                           2010-05-03
2   0.5*(15 - 10) + 10 = 12.5       2010-05-06
3   0.5*(17 - 12.5) + 12.4 = 14.75  2010-05-13

我没有在Java中实现UDF,而是想通过在函数中使用Hive SQL构建来获得相同的结果。我认为应该在这里应用LAG功能,但我真的不擅长数据库......那么我是否朝着正确的方向发展?是否有像Hive SQL这样的方法呢?

非常感谢!!

1 个答案:

答案 0 :(得分:1)

这有点复杂,因为前两个数字的系数总是相同的,正如您所描述的那样。我倾向于这样做:

select v.*,
       sum(power(2, n)*val) over (order by id) / sum(power(2, n) over (order by id)
from (select v.*, row_number() over (order by id) - 1 as n
      from vals
     ) v

然而,这给出了结果为10,13.33和15.42。相对于你想要的,它减少了第一个值。通过将其添加到:

中可以很容易地解决这个问题
select v.*,
       (max(case when n = 0 then val else 0 end) over (order by id) +
        sum(power(2, n)*val) over (order by id)
       ) / (1 + sum(power(2, n)) over (order by id)
from (select v.*, row_number() over (order by id) - 1 as n
      from vals v
     ) v

Here是使用Oracle演示代码的SQL小提琴。我不能100%确定数字函数在Hive中是否具有相同的名称,但它们应该是类似的。此外,如果序列很大,则使用此特定代码会冒数值溢出的风险。