我试图计算蜂巢中的指数平均值。 对于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这样的方法呢?
非常感谢!!
答案 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中是否具有相同的名称,但它们应该是类似的。此外,如果序列很大,则使用此特定代码会冒数值溢出的风险。