例程简介

本文档介绍了如何选择例程,这是一种资源类型,可用于在 BigQuery 中创建函数或存储过程。

支持的例程

BigQuery 支持以下例程:

如何选择例程

本部分介绍了选择例程时应考虑的因素,并按任务比较了各种例程。

要考虑的因素

如需选择例程,请考虑以下因素,这些因素将在每种例程类型的相应部分中进行说明:

  • 要实现的任务类型。
  • 要使用的编程语言。
  • 为例程实现的持久性类型:临时或永久。
  • 例程所需的重用类型:跨单个或多个查询。
  • 性能考虑因素。
  • 访问外部服务。
  • 与用户分享例程。

按任务比较例程

下表显示了您可以为每种类型的例程执行的任务类型:

任务

例程资源类型

创建可在 BigQuery 中执行通用任务的函数。

SQL 或 JavaScript UDF

SQL 或 JavaScript UDAF

在 BigQuery 中创建执行通用任务的函数,并使用 Cloud 资源连接与外部 Google Cloud 系统进行通信。

Python UDF

创建可聚合数据的函数。

UDAF

使用参数创建表。

表函数

创建使用 BigQuery 中不支持的语言、库或服务的函数。这些函数可直接与 Cloud Run functionsCloud Run 集成。

远程函数

使用过程语言在一个查询中执行多个语句作为多语句查询。您可以使用多语句查询执行以下操作:

  • 以共享状态按顺序运行多个语句。
  • 自动执行管理任务,例如创建或删除表。
  • 使用 IFWHILE 等编程结构实现复杂的逻辑。

在 BigQuery 中为 Apache Spark 创建和调用存储过程。

存储过程

用户定义的函数 (UDF)

借助 UDF,您可以使用 SQL 表达式、JavaScript 代码或 Python 代码创建函数。UDF 接受输入列、对输入执行操作并以值的形式返回这些操作的结果。

UDF 可以定义为永久性或临时性。永久性 UDF 可以重复用于多个查询,而临时性 UDF 仅存在于单个查询范围内。

您可以创建与自定义遮盖例程搭配使用的 UDF,这些 UDF 在将 UDF 应用于列后会返回列的值。创建自定义遮盖例程后,可将其作为遮盖规则提供,详见创建数据政策

如需详细了解 UDF,请参阅以下资源:

基于语言的 UDF

  • 基于 SQL 的 UDF 支持模板化 UDF 参数,在调用 UDF 时,这些参数可以匹配多个参数类型。SQL UDF 还可以返回标量子查询的值。
  • 借助 JavaScript UDF,您可以从 SQL 查询中调用以 JavaScript 编写的代码。
    • 与标准 SQL 查询相比,JavaScript UDF 通常会消耗更多的槽资源,从而降低作业性能。
    • 如果函数可以使用 SQL 表示,则通常最好将代码作为标准 SQL 查询作业运行。
  • 基于 Python 的 UDF 在 BigQuery 托管式资源上构建和运行。借助这些 UDF,您可以使用 Python 实现函数,并在 SQL 查询中使用该函数。

社区提供的 UDF

除了您创建的 UDF 之外,社区提供的 UDF 还位于 bigquery-public-data.persistent_udfs 公共数据集和开源 bigquery-utils GitHub 代码库中。

用户定义的聚合函数 (UDAF)

借助 UDAF,您可以使用包含 SQL 或 JavaScript 代码的表达式创建聚合函数。UDAF 接受输入列,一次对一组行执行计算,然后将该计算的结果作为单个值返回。

UDAF 无法变更数据、与外部系统通信,也无法将日志发送到 Google Cloud Observability 或类似应用。

如需了解详情,请参阅以下资源:

SQL UDAF

SQL UDAF 通常会聚合中所有行的函数参数。不过,您可以使用 NOT AGGREGATE 关键字将函数参数指定为非聚合。非聚合函数参数是一个标量函数参数,一个组中的所有行都具有常量值。SQL UDAF 可以同时包含聚合参数和非聚合参数。

JavaScript UDAF

JavaScript UDAF 可以包含 JavaScript 库。JavaScript 函数正文可以包含自定义 JavaScript 代码,例如 JavaScript 全局变量和自定义函数。

由于基于 JavaScript 的函数通常会使用更多资源,因此参考这些性能提示可能会有所帮助。

JavaScript UDAF 存在一些限制。仅允许使用特定类型编码,并且对序列化和反序列化有要求

比较 UDF 和 UDAF

选择 UDF 而不是选择 UDAF 取决于您尝试执行的特定任务。

  • 如需对单个数据值执行计算或转换,请使用 UDF。
  • 如需对一组数据值执行相同的操作,请使用 UDAF。

例如,如果您想计算一列数字的平均值,请使用 UDAF。如果您想将字符串列转换为大写,请使用 UDF。

UDF 和 UDAF 具有以下相似之处:

UDF 和 UDAF 存在以下区别:

属性

UDF

UDAF

定义

用户定义的函数 (UDF) 接受输入列、对输入执行操作并以值的形式返回这些操作的结果。

用户定义的聚合函数 (UDAF) 接受输入列,一次对一组行执行计算,然后将该计算的结果作为单个值返回。

支持的语言

SQL、JavaScript 和 Python

SQL 和 JavaScript

持久性

  • 可以是临时性的,也可以是永久性的。
  • 您可以在多个查询中使用永久性 UDF。
  • 临时性 UDF 只能用于单个查询。
  • Python UDF 只能是永久性的,不能是临时性的。
  • 可以是临时性的,也可以是永久性的。
  • 您可以在多个查询中使用永久性 UDAF。
  • 临时性 UDAF 只能用于单个查询、脚本、会话或过程。
  • 在所有者之间共享永久性 UDAF 时,可以安全调用这些 UDAF。

参数和数据类型

UDF 接受符合 GoogleSQL for BigQuery 数据类型的参数值。有些 SQL 类型可直接映射到 JavaScript 类型,但有些则不行。请参阅 JavaScript 支持的类型

对于 SQL UDF,参数值可以是 ANY TYPE,在调用函数时,该值可以匹配多个参数类型。

只有 JavaScript UDF 具有确定性说明符,可向 BigQuery 提供关于是否可缓存查询结果的提示。

SQL 和 JavaScript UDAF 接受符合 GoogleSQL for BigQuery 数据类型的参数值。

函数参数可以是聚合参数,也可以是非聚合参数。

用量

UDF 通常用于数据清理、转换和验证。

UDAF 通常用于计算汇总统计信息,例如平均值、总和和计数。

表函数

表函数(也称为表值函数 (TVF))是一种返回表的 UDF。您可以在可使用表的任何位置使用表函数。表函数的行为与视图类似,但表函数可以接受参数。

您可以使用表函数执行以下操作:

  • 传入多个参数。
  • 在表有效的任何上下文中调用表函数。
  • 将表函数的输出与另一个表联接。
  • 子查询中使用表函数。

如需详细了解表函数,请参阅表函数限制以及配额和限制

远程函数

借助远程函数,您可以使用 SQL 和 JavaScript 以外的语言来实现函数,也可以使用 BigQuery UDF 中不支持的库或服务。

BigQuery 远程函数可将您的 Google SQL 函数与 Cloud Run functions 集成,并使用任何支持的语言运行 Cloud Run,然后通过 Google SQL 查询调用这些函数。

以下任务示例展示了您可以使用远程函数执行的操作:

创建远程函数需要执行以下步骤:

  1. 在 Cloud Run functions 或 Cloud Run 中创建 HTTP 端点。
  2. 使用 CLOUD_RESOURCE 连接类型在 BigQuery 中创建远程函数。
  3. 与任何其他适用于 BigQuery 的 UDF 一样,在查询中使用该远程函数。

如需详细了解远程函数,请参阅远程函数限制以及配额和限制

存储过程

SQL 存储过程是可以从其他查询或其他存储过程调用的语句集合。您将过程命名并存储在 BigQuery 数据集中。

存储过程支持过程语言语句,可让您执行定义变量和实现控制流等操作。如需详细了解过程语言语句,请参阅过程语言参考

存储过程可以执行以下操作:

  • 接受输入参数并返回值作为输出。
  • 多个用户访问或修改多个数据集中的数据。
  • 包含多语句查询

一些存储过程内置于 BigQuery 中,不需要创建。这称为系统过程,您可以在系统过程参考中详细了解它们。

系统还支持 BigQuery 中的 Spark 的存储过程。这些过程具有配额和限制

如需详细了解存储过程,请参阅 SQL 存储过程