使用远程函数分析对象表

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

概览

您可以使用远程函数分析由对象表表示的非结构化数据。通过远程函数,您可以调用在 Cloud Run 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. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the BigQuery, BigQuery Connection API, Cloud Run functions APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the BigQuery, BigQuery Connection API, Cloud Run functions APIs.

    Enable the APIs

  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 Run functions 超时并提高处理并行性。

示例

以下 Cloud Run 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 Run 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";

后续步骤

了解如何对图片对象表运行推理