日常活动简介
本文档介绍了如何选择例程,这是您在 BigQuery 中创建函数或存储过程时使用的资源类型。
支持的例程
BigQuery 支持以下例程:
如何选择日常安排
本部分介绍了选择日常安排时应考虑的因素,并按任务比较了日常安排。
要考虑的因素
如需选择日常安排,请考虑以下因素(每个类型的日常安排部分中均有介绍):
- 要实现的任务类型。
- 要使用的编程语言。
- 要为例程实现的持久性类型:临时或永久。
- 该例程所需的重用类型:跨单个查询或多个查询。
- 性能注意事项。
- 访问外部服务。
- 与用户分享日常安排。
按任务比较日常安排
下表显示了您可以针对每种类型的日常安排执行的任务类型:
任务 |
例程资源类型 |
---|---|
创建在 BigQuery 中执行通用任务的函数。 |
SQL 或 JavaScript UDF SQL 或 JavaScript UDAF |
创建在 BigQuery 中执行通用任务并使用 Cloud 资源连接与外部系统通信的函数。 Trusted Cloud by S3NS |
Python UDF |
创建用于汇总数据的函数。 |
UDAF |
使用参数创建表。 |
表函数 |
创建使用 BigQuery 不支持的语言、库或服务的函数。这些函数可直接与 Cloud Run functions 和 Cloud Run 集成。 |
远程函数 |
使用过程语言在一个查询中执行多个语句作为多语句查询。您可以使用多语句查询执行以下操作:
在 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 查询中使用该函数。
- 您可以使用 Cloud 资源连接服务账号,从 Python UDF 访问 Trusted Cloud 服务或外部服务。
- 您还可以从 Python 软件包索引 (PyPI) 安装第三方库。
社区贡献的 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 无法变更数据、与外部系统通信,也无法将日志发送到 Google Cloud Observability 或类似应用。唯一的例外是 Python UDF,它们可以使用 Cloud 资源连接访问外部服务。不过,Python UDF 不支持 VPC Service Controls 或客户管理的加密密钥 (CMEK)。
- UDAF 具有与 UDF 相同的限制,但还有一些其他限制。
- UDF 和 UDAF 具有相同的配额和限制。
UDF 和 UDAF 有以下区别:
属性 |
UDF |
UDAF |
---|---|---|
定义 |
用户定义的函数 (UDF) 接受输入列、对输入执行操作并以值的形式返回这些操作的结果。 |
用户定义的汇总函数 (UDAF) 接受输入列,一次对一组行执行计算,然后将该计算的结果作为单个值返回。 |
支持的语言 |
SQL、JavaScript 和 Python |
SQL 和 JavaScript |
持久性 |
|
|
参数和数据类型 |
UDF 接受符合适用于 BigQuery 的 GoogleSQL 数据类型的参数值。有些 SQL 类型可直接映射到 JavaScript 类型,但有些则不行。请参阅 JavaScript 支持的类型。 对于 SQL UDF,参数值可以是 只有 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 查询调用这些函数。
以下任务是使用远程函数可执行的操作示例:
创建远程函数需要执行以下步骤:
- 在 Cloud Run Functions 或 Cloud Run 中创建 HTTP 端点。
- 使用
CLOUD_RESOURCE
连接类型在 BigQuery 中创建远程函数。 - 与任何其他 BigQuery UDF 一样,在查询中使用该远程函数。
存储过程
SQL 存储过程是可以从其他查询或其他存储过程调用的语句集合。您将过程命名并存储在 BigQuery 数据集中。
存储过程支持过程语言语句,可让您执行定义变量和实现控制流等操作。如需详细了解过程语言语句,请参阅过程语言参考。
存储过程可以执行以下操作:
- 接受输入参数并返回值作为输出。
- 多个用户可以访问或修改多个数据集中的数据。
- 包含多语句查询。
一些存储过程内置于 BigQuery 中,不需要创建。这称为系统过程,您可以在系统过程参考中详细了解它们。
也支持 BigQuery 中的 Spark 存储过程。这些过程有配额和限制。
如需详细了解存储过程,请参阅 SQL 存储过程。