Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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 bigquery BigQuery是否支持用户定义的分析函数?_Google Bigquery_Analytic Functions_Bigquery Udf - Fatal编程技术网

Google bigquery BigQuery是否支持用户定义的分析函数?

Google bigquery BigQuery是否支持用户定义的分析函数?,google-bigquery,analytic-functions,bigquery-udf,Google Bigquery,Analytic Functions,Bigquery Udf,BigQuery支持: SQL和JavaScript中的UDF。 计算一组行上的值,并为每一行返回一个结果。这些函数可以与子句一起使用。有一组预定义的分析函数。 问题1:BigQuery是否支持用户定义的分析函数 这背后的动机是我想要实现Python代码中常见的模式。这对于组内规范化和其他使用组统计信息的转换非常有用 我在Standart SQL中做了一个小测试: create or replace function `mydataset.mylen`(arr array<string&g

BigQuery支持:

SQL和JavaScript中的UDF。 计算一组行上的值,并为每一行返回一个结果。这些函数可以与子句一起使用。有一组预定义的分析函数。 问题1:BigQuery是否支持用户定义的分析函数

这背后的动机是我想要实现Python代码中常见的模式。这对于组内规范化和其他使用组统计信息的转换非常有用

我在Standart SQL中做了一个小测试:

create or replace function `mydataset.mylen`(arr array<string>) returns int64 as (
  array_length(arr)
);

WITH Produce AS
 (SELECT 'kale' as item, 23 as purchases, 'vegetable' as category
  UNION ALL SELECT 'orange', 2, 'fruit'
  UNION ALL SELECT 'cabbage', 9, 'vegetable'
  UNION ALL SELECT 'apple', 8, 'fruit'
  UNION ALL SELECT 'leek', 2, 'vegetable'
  UNION ALL SELECT 'lettuce', 10, 'vegetable')
SELECT 
  item, 
  purchases, 
  category, 
  `mydataset.mylen`(item) over (mywindow) as windowlen
FROM Produce
window mywindow as (
  partition by category
)

当我运行上述代码时,我得到:

查询错误:函数mydataset.mylen不支持[16:3]处的OVER子句


因此,如果BigQuery确实支持分析UDF,问题2:如何实现UDF以使其支持OVER子句?

您很快就可以解决这个问题了:

对于答案的读者来说,BigQuery不支持用户定义的聚合/分析函数,因此模拟它的一种方法是编写接受数组作为输入的标量UDF。然后在查询中,使用array_agg函数将数据打包为UDF的输入,这是问题中缺少的步骤

`mydataset.mylen`mywindow上的项作为windowlen => `mydataset.mylen`array\u aggitem在mywindow上作为windowlen
据我所知,mydataset.mylen函数分别应用于每一行,并获取分区组作为参数。这就是为什么函数不必返回大小相似的数组——它是为每一行调用的,而不是为一组行调用的。这太棒了!使用这种方法,我现在可以将pandas代码传输到BigQuery。我看到的主要区别是没有矢量化:我将计算每行分区组上的聚合。我猜这是BigQuery的优化器能够解决的一件小事。不确定您的预期输出是什么,如果您只需要一组值,您应该使用group BY category,而不是带有category的窗口函数。但在这两种情况下,UDF是相同的。