使用远程函数分析对象表

本文档介绍如何使用远程函数分析对象表中的非结构化数据。

概览

您可以使用远程函数分析由对象表表示的非结构化数据。通过远程函数,您可以调用在 Cloud Functions 或 Cloud Run 上运行的函数,您可以编写该函数来访问某些资源,例如:

  • Google 的预训练 AI 模型,包括 Cloud Vision API 和 Document AI。
  • 开源库,例如 Apache Tika
  • 您自己的自定义模型。

如需使用远程函数分析对象表数据,您必须在调用远程函数时为对象表中的对象生成并传入签名网址。这些签名网址用于授予远程函数访问对象的权限。

所需权限

  • 如需创建远程函数使用的连接资源,您需要以下权限:

    • bigquery.connections.create
    • bigquery.connections.get
    • bigquery.connections.list
    • bigquery.connections.update
    • bigquery.connections.use
    • bigquery.connections.delete
  • 如需创建远程函数,您需要与 Cloud Functions DeveloperCloud Run Developer 角色关联的权限。

  • 如需调用远程函数,您需要拥有远程函数中所述的权限。

  • 如需使用远程函数分析对象表,您需要拥有该对象表的 bigquery.tables.getData 权限。

准备工作

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  3. 确保您的 Google Cloud 项目已启用结算功能

  4. 启用 BigQuery, BigQuery Connection API, Cloud Functions API。

    启用 API

  5. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  6. 确保您的 Google Cloud 项目已启用结算功能

  7. 启用 BigQuery, BigQuery Connection API, Cloud Functions API。

    启用 API

  8. 确保 BigQuery 管理员已创建连接设置对 Cloud Storage 的访问权限

创建远程函数

如需了解有关创建远程函数的一般说明,请参阅使用远程函数

创建用于分析对象表数据的远程函数时,您必须传入为对象表中的对象生成的签名网址。您可以使用 STRING 数据类型的输入参数来执行此操作。签名网址将作为 HTTP POST 请求的 calls 字段的输入数据提供给远程函数。请求的示例如下:

{
  // Other fields omitted.
  "calls": [
    ["https://storage.googleapis.com/mybucket/1.pdf?X-Goog-SignedHeaders=abcd"],
    ["https://storage.googleapis.com/mybucket/2.pdf?X-Goog-SignedHeaders=wxyz"]
  ]
}

通过使用向签名网址发出 HTTP GET 请求的方法,您可以读取远程函数中的对象。远程函数可以访问该对象,因为签名网址在其查询字符串中包含身份验证信息。

为远程函数指定 CREATE FUNCTION 语句时,我们建议您将 max_batching_rows 选项设置为 1,以避免 Cloud Functions 超时并提高处理并行性。

示例

以下 Cloud Functions Python 代码示例会读取存储对象并将其内容长度返回给 BigQuery:

import functions_framework
import json
import urllib.request

@functions_framework.http
def object_length(request):
  calls = request.get_json()['calls']
  replies = []
  for call in calls:
    object_content = urllib.request.urlopen(call[0]).read()
    replies.append(len(object_content))
  return json.dumps({'replies': replies})

部署后,此函数将具有类似于 https://us-central1-myproject.cloudfunctions.net/object_length 的端点。

以下示例展示了如何根据此 Cloud Functions 函数创建 BigQuery 远程函数:

CREATE FUNCTION mydataset.object_length(signed_url STRING) RETURNS INT64
REMOTE WITH CONNECTION `us.myconnection`
OPTIONS(
  endpoint = "https://us-central1-myproject.cloudfunctions.net/object_length",
  max_batching_rows = 1
);

如需查看分步指南,请参阅《教程:使用远程函数分析对象表》

调用远程函数

如需对对象表数据调用远程函数,请在查询的 select_list 中引用远程函数,然后在 FROM 子句中调用 EXTERNAL_OBJECT_TRANSFORM 函数以生成对象的签名网址。

以下示例展示了典型的语句语法:

SELECT uri, function_name(signed_url) AS function_output
FROM EXTERNAL_OBJECT_TRANSFORM(TABLE my_dataset.object_table, ["SIGNED_URL"])
LIMIT 10000;

以下示例展示了如何使用远程函数仅处理对象表内容的子集:

SELECT uri, function_name(signed_url) AS function_output
FROM EXTERNAL_OBJECT_TRANSFORM(TABLE my_dataset.object_table, ["SIGNED_URL"])
WHERE content_type = "application/pdf";

后续步骤