返回表的 UDF

Joy*_*yce 3 user-defined-functions google-bigquery

在 BigQuery 中,如何编写返回表的 UDF?我想要的是能够接受参数的 CTE。据我所知,UDF 只返回标量,对吗?

Mik*_*ant 6

UDF 可以返回不同类型的 ARRAYS,包括 ARRAY of STRUCT

但显然它与返回表不同,BigQuery UDF 并不真正支持返回表 [目前]

PS如果您有要解决的特定问题 - 提出特定问题,有人会提供帮助

下面是两个相对幼稚和无用的(从实际角度来看)示例 - 但我希望它们展示了使用 ARRAYS 在某些扩展 CTE 上模仿的概念

示例#1

#standardSQL
CREATE TEMPORARY FUNCTION pseudoCTE(x INT64, y INT64) AS (
  GENERATE_ARRAY(x, y)
);
SELECT * FROM UNNEST(pseudoCTE(1,5)) z   
Run Code Online (Sandbox Code Playgroud)

结果

Row z    
1   1    
2   2    
3   3    
4   4    
5   5    
Run Code Online (Sandbox Code Playgroud)

示例#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  
Run Code Online (Sandbox Code Playgroud)


god*_*dot 5

在 BigQuery 中,您现在拥有table functions

表函数也称为表值函数 (TVF),是返回表的用户定义函数。

一个例子(在谷歌文档中找到):

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
Run Code Online (Sandbox Code Playgroud)

要执行它:

SELECT * FROM mydataset.names_by_year(1950)
ORDER BY total DESC
LIMIT 5
Run Code Online (Sandbox Code Playgroud)