在 BigQuery 中使用 UDF 时,是否可以在 windows 之间保持共享状态?
Is it possible to keep a shared state between windows when using UDFs in BigQuery?
这是我的 关于能够在 BigQuery 中模拟聚合函数(如在 PGSQL 中)的后续问题。
前一个问题中提出的解决方案确实适用于每个 window 上应用的函数独立于前一个 window 的情况 - 例如计算简单平均值等,但是在计算递归时类似指数移动平均线的函数,其中公式为:
EMA[i] = price[i]*k + EMA[i-1]×(1−k)
使用上一个问题中的相同示例,
CREATE OR REPLACE FUNCTION temp_db.ema_func(arr ARRAY<int64>, window_size int8)
RETURNS int64 LANGUAGE js AS """
if(arr.length<=window_size){
// calculate a simple moving average till end of first window
var SMA = 0;
for(var i = 0;i < arr.length; i++){
SMA = SMA + arr[i]
}
return SMA/arr.length
}else{
// start calculation of EMA where EMA[i-1] is the SMA we calculated for the first window
// note: hard-coded constant (k) for the sake of simplicity
// the problem: where do I get EMA[i-1] or prev_EMA from?
// in this example, we only need the most recent value, but in general case, we would
// potentially have to do other calculations with the new value
return curr[curr.length-1]*(0.05) + prev_ema*(1−0.05)
}
""";
select s_id, temp_db.ema_func(ARRAY_AGG(s_price) over (partition by s_id order by s_date rows 40 preceding), 40) as temp_col
from temp_db.s_table;
在 PGSQL 中将状态变量存储为自定义类型非常容易,并且是聚合函数参数的一部分。是否可以使用 BigQuery 模拟相同的功能?
我不认为它可以为 BigQuery 通用地完成,而是想看看具体情况,看看是否有一些合理的解决方法。同时,递归和聚合 UDF 是 BQ [希望] 不支持的东西,因此您可能希望提交相应的 feature request(s).
同时结账BQ scripting但我认为你的情况不适合那里
这是我的
前一个问题中提出的解决方案确实适用于每个 window 上应用的函数独立于前一个 window 的情况 - 例如计算简单平均值等,但是在计算递归时类似指数移动平均线的函数,其中公式为:
EMA[i] = price[i]*k + EMA[i-1]×(1−k)
使用上一个问题中的相同示例,
CREATE OR REPLACE FUNCTION temp_db.ema_func(arr ARRAY<int64>, window_size int8)
RETURNS int64 LANGUAGE js AS """
if(arr.length<=window_size){
// calculate a simple moving average till end of first window
var SMA = 0;
for(var i = 0;i < arr.length; i++){
SMA = SMA + arr[i]
}
return SMA/arr.length
}else{
// start calculation of EMA where EMA[i-1] is the SMA we calculated for the first window
// note: hard-coded constant (k) for the sake of simplicity
// the problem: where do I get EMA[i-1] or prev_EMA from?
// in this example, we only need the most recent value, but in general case, we would
// potentially have to do other calculations with the new value
return curr[curr.length-1]*(0.05) + prev_ema*(1−0.05)
}
""";
select s_id, temp_db.ema_func(ARRAY_AGG(s_price) over (partition by s_id order by s_date rows 40 preceding), 40) as temp_col
from temp_db.s_table;
在 PGSQL 中将状态变量存储为自定义类型非常容易,并且是聚合函数参数的一部分。是否可以使用 BigQuery 模拟相同的功能?
我不认为它可以为 BigQuery 通用地完成,而是想看看具体情况,看看是否有一些合理的解决方法。同时,递归和聚合 UDF 是 BQ [希望] 不支持的东西,因此您可能希望提交相应的 feature request(s).
同时结账BQ scripting但我认为你的情况不适合那里