gpt4 book ai didi

sql - 在 HIVE 中计算移动指数平均值

转载 作者:行者123 更新时间:2023-12-04 22:09:40 39 4
gpt4 key购买 nike

我正在尝试计算 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 的方法来执行此操作?

非常感谢!!

最佳答案

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

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 Fiddle。我不是 100% 确定数字函数在 Hive 中是否具有相同的名称,但它们应该是相似的。此外,如果您的序列很大,则使用此特定代码会冒数字溢出的风险。

关于sql - 在 HIVE 中计算移动指数平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25855201/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com