【问题标题】:Is it possible to keep a shared state between windows when using UDFs in BigQuery?在 BigQuery 中使用 UDF 时是否可以在窗口之间保持共享状态?
【发布时间】:2020-09-10 19:15:45
【问题描述】:

这是我的previous question 的后续问题,关于能够在 BigQuery 中模拟聚合函数(如在 PGSQL 中)。

上一个问题中提出的解决方案确实适用于每个窗口上应用的函数独立于前一个窗口的情况 - 例如计算简单平均值等,但是在计算指数移动平均值等递归函数时,公式为: 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 模拟相同的功能?

【问题讨论】:

  • temp_db.s_table 表中有多少行?
  • 目前约 6500 万。分区在一个名为“date_month”的字段上,所有日期都只是“YEAR-MONTH-01”。这是一张约 22k 行情的 EOD 价格表。我没有提到任何关于分区或过滤查询以简化问题。
  • 所以 EMA 计算将在特定分区内 - 对吗? /per 分区的大小(行数)是多少?
  • 我不会说一个分区,但可能是一组分区。由于每个分区是表中所有符号的 1 个月 EOD 数据,我会说大约 20,000*25 个交易日 = 每个分区约 500,000 条记录。如果 EMA 的周期 > 25 左右,自然会使用更多分区对吗?
  • 当然。我的意思是计算所有分区,但每个分区/分区内。 p.s.并不意味着我还有建议 :o) 只是想澄清用例

标签: google-cloud-platform google-bigquery bigquery-udf


【解决方案1】:

我不认为 BigQuery 可以通用,而是想看看具体情况,看看是否有可能采取一些合理的解决方法。同时,BQ [希望还] 不支持递归和聚合 UDF,因此您可能需要提交各自的 feature request(s)

同时结帐BQ scripting,但我认为您的情况不适合那里

【讨论】:

  • 我现在正在写功能请求。我一直在研究 BQ 脚本,它可能能够解决我拥有的其他用例。感谢您的讨论!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-26
  • 1970-01-01
  • 2011-03-29
  • 2015-07-13
  • 2015-11-28
  • 2010-11-12
  • 1970-01-01
相关资源
最近更新 更多