Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google cloud platform 在BigQuery中模拟窗口聚合的UDF的变通方法?_Google Cloud Platform_Google Bigquery_Bigquery Udf - Fatal编程技术网

Google cloud platform 在BigQuery中模拟窗口聚合的UDF的变通方法?

Google cloud platform 在BigQuery中模拟窗口聚合的UDF的变通方法?,google-cloud-platform,google-bigquery,bigquery-udf,Google Cloud Platform,Google Bigquery,Bigquery Udf,我试图在BigQuery中编写自定义聚合函数。在PGSQL中,我可以编写可以与over子句一起使用的函数,但是我不能为BigQuery编写任何这样的聚合函数-是否可以编写一个函数,该函数接收分区的一列的整个数组,并基于某个自定义计算返回值 我尝试的示例: CREATE OR REPLACE FUNCTION temp_db.temp_func(arr ARRAY<int64>) RETURNS int64 LANGUAGE js AS """ ret

我试图在BigQuery中编写自定义聚合函数。在PGSQL中,我可以编写可以与
over
子句一起使用的函数,但是我不能为BigQuery编写任何这样的聚合函数-是否可以编写一个函数,该函数接收分区的一列的整个数组,并基于某个自定义计算返回值

我尝试的示例:

CREATE OR REPLACE FUNCTION temp_db.temp_func(arr ARRAY<int64>)
RETURNS int64 LANGUAGE js AS """
  return arr.length*10 //example calculation
  //actual result involves looping over the array and doing few calculations 
""";

select s_id, temp_db.temp_func(s_price) over (partition by s_id order by s_date rows 40 preceding) as temp_col
from temp_db.s_table;
创建或替换函数temp\u db.temp\u func(arr数组)
将int64语言js返回为“”
返回arr.length*10//计算示例
//实际结果包括在数组上循环并进行少量计算
""";
选择s_id,temp_db.temp_func(s_price)over(按s_id分割,按s_日期排序,前面第40行)作为临时列
来自temp_db.s_表;
这会产生一个错误:
查询错误:函数temp\u db.temp\u func不支持[6:19]处的OVER子句。

对于我的目的来说,这些参数是不够的,因此我需要能够对自定义窗口大小执行自定义计算。BigQuery中是否有解决方法?

创建或替换函数temp\u db.temp\u func(arr数组)
CREATE OR REPLACE FUNCTION temp_db.temp_func(arr ARRAY<int64>)
RETURNS int64 LANGUAGE js AS """
  return arr.length*10 //example calculation
  //actual result involves looping over the array and doing few calculations 
""";

select s_id, temp_db.temp_func(ARRAY_AGG(s_price) over (partition by s_id order by s_date rows 40 preceding)) as temp_col
from temp_db.s_table;
将int64语言js返回为“” 返回arr.length*10//计算示例 //实际结果包括在数组上循环并进行少量计算 """; 选择s_id,temp_db.temp_func(数组_AGG(s_price)over(按s_id划分顺序按s_日期第40行)作为临时列 来自temp_db.s_表;
创建或替换函数temp\u db.temp\u func(arr数组)
将int64语言js返回为“”
返回arr.length*10//计算示例
//实际结果包括在数组上循环并进行少量计算
""";
选择s_id,temp_db.temp_func(数组_AGG(s_price)over(按s_id划分顺序按s_日期第40行)作为临时列
来自temp_db.s_表;

谢谢你的建议!这对我有用。你知道这在性能方面与原生PGSQL聚合UDF相比如何吗?不知何故,我认为不应该有性能影响,而应该是与不同引擎相关的差异,只是我的猜测,谢谢!我很快就会查出来的!我还有一个相关的问题:是否有可能维护某种状态变量,从一个窗口共享到另一个窗口?例如,如果我想在计算下一个窗口的结果时使用第一个窗口的结果,我将如何在BigQuery中这样做(PGSQL中聚合函数中的第一个变量正是这样做的)?作为上述解决方案的一部分-我不这么认为!但是如果你可以发布新的问题和所有相关的细节,例如-我们可以尝试找到一个解决方案-通常我们会:o)谢谢你的建议!这对我有用。你知道这在性能方面与原生PGSQL聚合UDF相比如何吗?不知何故,我认为不应该有性能影响,而应该是与不同引擎相关的差异,只是我的猜测,谢谢!我很快就会查出来的!我还有一个相关的问题:是否有可能维护某种状态变量,从一个窗口共享到另一个窗口?例如,如果我想在计算下一个窗口的结果时使用第一个窗口的结果,我将如何在BigQuery中这样做(PGSQL中聚合函数中的第一个变量正是这样做的)?作为上述解决方案的一部分-我不这么认为!但如果你能发布一个新的问题和所有相关的细节,例如-我们可以尝试找到一个解决方案-通常我们会:o)