使用远程函数分析对象表
概览
您可以使用远程函数分析由对象表表示的非结构化数据。通过远程函数,您可以调用在 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 Developer 或 Cloud Run Developer 角色关联的权限。
如需调用远程函数,您需要拥有远程函数中所述的权限。
如需使用远程函数分析对象表,您需要拥有对象表的
bigquery.tables.getData
权限。
准备工作
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the BigQuery, BigQuery Connection API, Cloud Run functions APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the BigQuery, BigQuery Connection API, Cloud Run functions APIs.
- 确保 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";
后续步骤
了解如何对图片对象表运行推理。