为 BigQuery DataFrames 自定义 Python 函数
借助 BigQuery DataFrames,您可以将自定义 Python 函数转换为可以在 BigQuery DataFrames 对象上大规模运行的 BigQuery 制品。这种可扩展性支持使您可以执行超出 BigQuery DataFrames 和 SQL API 功能范围的操作,因此可以充分利用开源库。
所需的角色
如需获得完成本文档中的任务所需的权限,请让您的管理员为您授予项目的以下 IAM 角色:
-
BigQuery Data Editor (
roles/bigquery.dataEditor) -
BigQuery Connection Admin (
roles/bigquery.connectionAdmin) -
Cloud Functions Developer (
roles/cloudfunctions.developer) -
Service Account User (
roles/iam.serviceAccountUser) -
Storage Object Viewer (
roles/storage.objectViewer)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
用户定义的函数 (UDF)
借助 UDF(预览版),您可以将自定义 Python 函数转换为 Python UDF。如需查看用法示例,请参阅创建永久性 Python UDF。
在 BigQuery DataFrames 中创建 UDF 会在指定的数据集中创建一个 BigQuery 例程作为 Python UDF。如需查看完整的受支持参数集,请参阅 bigframes.pandas.udf。
要求
如需使用 BigQuery DataFrames UDF,请在项目中启用 BigQuery API。如果您在项目中提供 bigquery_connection 参数,还必须启用 BigQuery Connection API。
清理
除了直接在 Google Cloud 控制台中或使用其他工具清理云制品之外,您还可以使用 bigframes.pandas.get_global_session().bqclient.delete_routine(routine_id) 命令清理通过显式名称参数创建的 BigQuery DataFrames UDF。
限制
- UDF 中的代码必须是独立的,也就是说,不得包含对函数体外部定义的导入或变量的任何引用。
- UDF 中的代码必须与 Python 3.11 兼容,因为这是代码在云端执行时所处的环境。
- 在函数代码中进行细微更改(例如重命名变量或插入新行)后重新运行 UDF 定义代码会导致重新创建 UDF,即使这些更改对函数的行为无关紧要。
- 具有 BigQuery 例程读取访问权限的用户可以查看用户代码,因此您应谨慎添加敏感内容。
- 一个项目在一个 BigQuery 位置中一次最多可以拥有 1,000 个 Cloud Run 函数。
BigQuery DataFrames UDF 会部署用户定义的 BigQuery Python 函数,并且遵循相关的限制。
远程函数
借助 BigQuery DataFrames,您可以将自定义标量函数转换为 BigQuery 远程函数。如需查看用法示例,请参阅创建远程函数。 如需查看完整的受支持参数集,请参阅 remote_function。
在 BigQuery DataFrames 中创建远程函数会创建以下内容:
- Cloud Run 函数。
-
默认情况下,系统会使用名为
bigframes-default-connection的连接。如果您愿意,可以使用预配置的 BigQuery 连接,在这种情况下会跳过连接创建。系统会向默认连接的服务账号授予 Cloud Run 角色 (roles/run.invoker)。 使用通过 BigQuery 连接创建的 Cloud Run 函数的 BigQuery 远程函数。
要求
如需使用 BigQuery DataFrames 远程函数,您必须启用以下 API:
- BigQuery API (
bigquery.googleapis.com) - BigQuery Connection API (
bigqueryconnection.googleapis.com) - Cloud Functions API (
cloudfunctions.googleapis.com) - Cloud Run Admin API (
run.googleapis.com) - Artifact Registry API (
artifactregistry.googleapis.com) - Cloud Build API (
cloudbuild.googleapis.com) - Compute Engine API (
compute.googleapis.com) - Cloud Resource Manager API (
cloudresourcemanager.googleapis.com)
使用 BigQuery DataFrames 远程函数时,如果您使用的是默认 BigQuery 连接,则需要Project IAM Admin 角色 (roles/resourcemanager.projectIamAdmin);如果您使用的是预配置连接,则需要Browser 角色 (roles/browser)。您可以通过将 bigframes.pandas.options.bigquery.skip_bq_connection_check 选项设置为 True 来避免此要求,在这种情况下,连接(默认连接或预配置连接)会按原样使用,而不会进行任何存在或权限检查。如果您使用的是预配置连接并跳过连接检查,请验证以下各项:
- 连接是在正确的位置创建的。
- 如果您使用的是 BigQuery DataFrames 远程函数,则服务账号在项目中具有 Cloud Run Invoker 角色 (
roles/run.invoker)。
查看和管理连接
系统会使用您在自定义函数定义中提供的名称,在 BigQuery DataFrames 会话所在的相同位置创建 BigQuery 连接。如需查看和管理连接,请执行以下操作:
在 Google Cloud 控制台中,前往 BigQuery 页面。
选择您在其中创建了远程函数的项目。
在左侧窗格中,点击 探索器:

在探索器窗格中,展开该项目,然后点击连接。
BigQuery 远程函数在您指定的数据集中创建,或在匿名数据集(一种隐藏数据集类型)中创建。如果您在创建远程函数期间没有为其设置名称,BigQuery DataFrames 会应用以 bigframes 前缀开头的默认名称。如需查看和管理在用户指定的数据集中创建的远程函数,请执行以下操作:
在 Google Cloud 控制台中,前往 BigQuery 页面。
选择您在其中创建了远程函数的项目。
在左侧窗格中,点击 探索器:

在探索器窗格中,展开项目,然后点击数据集。
点击您在其中创建了远程函数的数据集。
点击日常安排标签页。
如需查看和管理 Cloud Run 函数,请执行以下操作:
转到 Cloud Run 页面
选择您在其中创建了函数的项目。
在可用服务列表中,按函数部署类型进行过滤。
如需识别由 BigQuery DataFrames 创建的函数,请查找以
bigframes为前缀的函数名称。
清理
除了直接在 Google Cloud 控制台中或使用其他工具清理云制品之外,您还可以通过以下方式清理不是使用显式名称参数创建的 BigQuery 远程函数及其关联的 Cloud Run 函数:
- 对于 BigQuery DataFrames 会话,请使用
session.close()命令。 - 对于默认的 BigQuery DataFrames 会话,请使用
bigframes.pandas.close_session()命令。 - 对于具有
session_id的过往会话,请使用bigframes.pandas.clean_up_by_session_id(session_id)命令。
您还可以使用 bigframes.pandas.get_global_session().bqclient.delete_routine(routine_id) 命令清理使用显式名称参数创建的 BigQuery 远程函数及其关联的 Cloud Run 函数。
限制
- 首次创建远程函数时,大约需要 90 秒才能使用它们。其他软件包依赖项可能会增加延迟时间。
- 在函数代码中及周围进行细微更改(例如重命名变量、插入新行或在笔记本中插入新单元)后重新运行远程函数定义代码可能会导致重新创建远程函数,即使这些更改对函数的行为无关紧要。
- 具有 Cloud Run 函数读取访问权限的用户可以查看用户代码,因此您应谨慎添加敏感内容。
- 一个项目在一个区域中一次最多可以拥有 1,000 个 Cloud Run 函数。如需了解详情,请参阅配额。
后续步骤
- 了解 BigQuery DataFrames 的 ML 和 AI 功能。
- 了解如何使用 Gemini 生成 BigQuery DataFrames 代码。
- 了解如何使用 BigQuery DataFrames 分析通过 PyPI 进行的软件包下载情况。
- 在 GitHub 上查看 BigQuery DataFrames 的源代码、示例笔记本和示例。
- 探索 BigQuery DataFrames API 参考文档。