日常活动简介

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

支持的例程

BigQuery 支持以下例程:

如何选择日常安排

本部分介绍了选择日常安排时应考虑的因素,并按任务比较了日常安排。

要考虑的因素

如需选择日常安排,请考虑以下因素(每个类型的日常安排部分中均有介绍):

  • 要实现的任务类型。
  • 要使用的编程语言。
  • 要为例程实现的持久性类型:临时或永久。
  • 该例程所需的重用类型:跨单个查询或多个查询。
  • 性能注意事项。
  • 访问外部服务。
  • 与用户分享日常安排。

按任务比较日常安排

下表显示了您可以针对每种类型的日常安排执行的任务类型:

任务

例程资源类型

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

SQL 或 JavaScript UDF

SQL 或 JavaScript UDAF

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

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

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

社区贡献的 UDF

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

用户定义的汇总函数 (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 只能是永久性 UDF,不能是临时性 UDF。
  • 可以是临时地址,也可以是永久地址。
  • 您可以在多个查询中使用永久性 UDAF。
  • 临时性 UDAF 只能用于单个查询、脚本、会话或过程。
  • 在所有者之间共享永久性 UDAF 时,可以安全调用这些 UDAF。

参数和数据类型

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

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

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

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

函数参数可以是汇总参数,也可以是非汇总参数。

用法

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

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

表函数

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

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

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

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

远程函数

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

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

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

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

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

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

存储过程

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

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

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

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

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

也支持 BigQuery 中的 Spark 存储过程。这些过程有配额和限制

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