BigQuery支持:
- SQL和JavaScript中的用户定义函数(UDF(
- 分析函数,用于计算一组行上的值,并为每一行返回一个结果。这些函数可以与OVER子句一起使用。有一组预定义的分析函数
问题#1:";BigQuery是否支持分析用户定义函数">
这背后的动机是,我想实现通常在Pythonpandans代码中看到的拆分-应用-组合模式。这对于组内规范化和其他使用组统计信息的转换可能很有用。
我在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`(item) over (mywindow) as windowlen
=>
`mydataset.mylen`(array_agg(item) over (mywindow)) as windowlen