【发布时间】:2019-03-28 04:41:36
【问题描述】:
在 BigQuery 中,如何编写返回表的 UDF?我想要的是能够接受参数的 CTE。据我所知,UDF 只返回标量,对吗?
【问题讨论】:
标签: google-bigquery user-defined-functions
在 BigQuery 中,如何编写返回表的 UDF?我想要的是能够接受参数的 CTE。据我所知,UDF 只返回标量,对吗?
【问题讨论】:
标签: google-bigquery user-defined-functions
UDF 可以返回不同类型的数组,包括 STRUCT 的数组
但显然它与返回表不一样,BigQuery UDF [尚未] 真正支持它
附:如果您有想要解决的具体问题 - 提出具体问题,有人会帮助您
下面是两个相对幼稚和无用(从实际角度来看)的示例 - 但我希望它们展示使用 ARRAYS 在某种程度上模仿 CTE 的概念
示例 #1
#standardSQL
CREATE TEMPORARY FUNCTION pseudoCTE(x INT64, y INT64) AS (
GENERATE_ARRAY(x, y)
);
SELECT * FROM UNNEST(pseudoCTE(1,5)) z
结果
Row z
1 1
2 2
3 3
4 4
5 5
示例 #2
#standardSQL
CREATE TEMPORARY FUNCTION pseudoCTE(x INT64, y INT64) AS (
ARRAY(SELECT AS STRUCT z AS id, RAND() AS value
FROM UNNEST(GENERATE_ARRAY(x, y)) z)
);
SELECT * FROM UNNEST(pseudoCTE(1,5))
Row id value
1 1 0.9319445195173228
2 2 0.36404932965409453
3 3 0.4615807541752828
4 4 0.5504890432993448
5 5 0.29635275888268836
【讨论】:
在 BigQuery 中,您现在拥有 table functions:
表函数,也称为表值函数 (TVF),是一种返回表的用户定义函数。
一个示例(可在 Google 文档中找到):
CREATE OR REPLACE TABLE FUNCTION mydataset.names_by_year(y INT64)
AS
SELECT year, name, SUM(number) AS total
FROM `bigquery-public-data.usa_names.usa_1910_current`
WHERE year = y
GROUP BY year, name
执行它:
SELECT * FROM mydataset.names_by_year(1950)
ORDER BY total DESC
LIMIT 5
【讨论】: