[编写BigQuery函数时,我一直在重复使用相同的结构声明,其中一些相当长,因为它们表示复杂的结构。
[在下面的示例中,定义了具有字段a
和b
的表,并定义了基本上需要接收和返回表行的函数addsuffix
。要定义功能,需要将重复这两个字段的定义的STRUCT明确指定为both作为输入和输出。
CREATE TABLE mytable (
a STRING, b STRING -- fields defined in schema
);
INSERT INTO mytable (a,b) VALUES('aaa','bbb');
CREATE TEMP FUNCTION addsuffix(row STRUCT<a STRING, b STRING>) -- repeated in input parameter def
RETURNS STRUCT<a STRING, b STRING> AS ( -- repeated in output parameter def
STRUCT(CONCAT(row.a, '_a_suffix') AS a, CONCAT(row.b, '_b_suffix') AS b)
);
SELECT addsuffix(r) AS withsuffix FROM mytable r;
这是非常多余的,不允许遵守DRY原理。有没有一种方法可以定义一次将一个STRUCT定义封装的“ typedef”,以便可以重复使用多次而无需重复?因此该函数将类似于以下内容:
TYPEDEF row_type AS STRUCT (a STRING, b STRING); -- defined once
CREATE TEMP FUNCTION addsuffix(row row_type) -- reused in input def
RETURNS row_type AS ( -- reused in output def
STRUCT(CONCAT(row.a, '_a_suffix') AS a, CONCAT(row.b, '_b_suffix') AS b)
);
假设没有这样的语言功能-是否可以使用一些等效的模式以免一遍又一遍地重复相同的结构定义?
作为一种简单的解决方法,请使用ANY TYPE
-即使您未定义输入变量,该函数也可以使用:
CREATE TABLE temp.mytable (a STRING, b STRING);INSERT INTO temp.mytable (a,b) VALUES('aaa','bbb')
;
CREATE TEMP FUNCTION addsuffix(row ANY TYPE)
RETURNS STRUCT<a STRING, b STRING> AS (
STRUCT(CONCAT(row.a, '_a_suffix') AS a, CONCAT(row.b, '_b_suffix') AS b)
);
SELECT addsuffix(r) AS withsuffix FROM temp.mytable r;