Google bigquery 在BigQuery中封装复杂代码

Google bigquery 在BigQuery中封装复杂代码,google-bigquery,user-defined-functions,Google Bigquery,User Defined Functions,我最近不得不从其他BQ表中生成一个BQ表。逻辑相当复杂,最后我编写了一个复杂的SQL语句 在OracleSQL中,我会编写一个PL/SQL过程,其中逻辑被分解成不同的部分,最常见的是合并语句。在某些情况下,我会将一些代码封装到函数中。生成的过程将是一系列DML语句,易于阅读和维护 然而,BQ不存在类似情况。UDF只是临时的,不能存储在视图中 问:我正在寻找使我的复杂的BQSQL代码更模块化和可读性的方法。有什么办法可以做到这一点吗?目前可用的选项是 WITH子句包含一个或多个命名子查询,其输出充

我最近不得不从其他BQ表中生成一个BQ表。逻辑相当复杂,最后我编写了一个复杂的SQL语句

在OracleSQL中,我会编写一个PL/SQL过程,其中逻辑被分解成不同的部分,最常见的是合并语句。在某些情况下,我会将一些代码封装到函数中。生成的过程将是一系列DML语句,易于阅读和维护

然而,BQ不存在类似情况。UDF只是临时的,不能存储在视图中


问:我正在寻找使我的复杂的BQSQL代码更模块化和可读性的方法。有什么办法可以做到这一点吗?

目前可用的选项是

WITH子句包含一个或多个命名子查询,其输出充当临时表,后续SELECT语句可以在任何子句或子查询中引用该临时表

我仍然认为这是一个很好的选择。 JS和SQLUDF在BigQuery中是可用的,据我们所知,BigQuery团队正致力于引入这两个版本,并将很快推出

同时,您可以将JSUDF的主体存储为JS库,并使用选项部分在您的UDF中引用它。请参见上述参考中包含外部库

2019年10月更新

使用和的能力现在处于测试阶段

因此,您可以在一个请求中向BigQuery发送多个语句,以使用变量,并使用控制流语句,如IF和WHILE等。 并且,您可以使用过程,这是一个语句块,可以从其他查询中调用


注意:它是测试版,目前可用的选项是使用

WITH子句包含一个或多个命名子查询,其输出充当临时表,后续SELECT语句可以在任何子句或子查询中引用该临时表

我仍然认为这是一个很好的选择。 JS和SQLUDF在BigQuery中是可用的,据我们所知,BigQuery团队正致力于引入这两个版本,并将很快推出

同时,您可以将JSUDF的主体存储为JS库,并使用选项部分在您的UDF中引用它。请参见上述参考中包含外部库

2019年10月更新

使用和的能力现在处于测试阶段

因此,您可以在一个请求中向BigQuery发送多个语句,以使用变量,并使用控制流语句,如IF和WHILE等。 并且,您可以使用过程,这是一个语句块,可以从其他查询中调用


注意:它是Beta版,但

BigQuery支持持久的用户定义函数。要开始,请参阅

例如,下面是一个CREATE FUNCTION语句,它创建一个函数来计算数组的中值:

创建函数dataset.medianarr任何类型为 选择 如果 MODARRAY_LENGTHarr,2=0, arr[OFFSETDIVARRAY_LENGTHarr,2-1]+arr[OFFSETDIVARRAY_LENGTHarr,2]/2, arr[OFFSETDIVARRAY_LENGTHarr,2] 从中选择数组_AGGx ORDER BY x AS arr从UNNESTarr AS x ; 执行此语句后,可以在后续查询中引用它:

选择dataset.median[7,1,2,10]作为中位数; 您还可以在逻辑视图中引用该函数。请注意,当前需要使用项目限定对视图中函数的引用,但是:

创建视图dataset.sampleview作为 选择x,`project name`.dataset.medianarray\u列作为中间值 来自'project name`.dataset.table
BigQuery支持持久的用户定义函数。要开始,请参阅

例如,下面是一个CREATE FUNCTION语句,它创建一个函数来计算数组的中值:

创建函数dataset.medianarr任何类型为 选择 如果 MODARRAY_LENGTHarr,2=0, arr[OFFSETDIVARRAY_LENGTHarr,2-1]+arr[OFFSETDIVARRAY_LENGTHarr,2]/2, arr[OFFSETDIVARRAY_LENGTHarr,2] 从中选择数组_AGGx ORDER BY x AS arr从UNNESTarr AS x ; 执行此语句后,可以在后续查询中引用它:

选择dataset.median[7,1,2,10]作为中位数; 您还可以在逻辑视图中引用该函数。请注意,当前需要使用项目限定对视图中函数的引用,但是:

创建视图dataset.sampleview作为 选择x,`project name`.dataset.medianarray\u列作为中间值 来自'project name`.dataset.table
谢谢你的回复。我想避免js,因为我还不熟悉它,但我会调查的。当然。因此,我认为使用SQL和UDF是您的出路:oThank you for your response。我想避免js,因为我还不熟悉它,但我会调查的。当然。因此,使用SQL和UDF是您的最佳选择,我认为:oI更愿意将其添加为对现有答案的评论或更新:o在任何情况下-伟大的工作BigQuery团队!非常感谢。我更愿意将此作为评论或更新添加 e到现有答案:o在任何情况下-伟大的工作BigQuery团队!非常感谢。