引言
企业需要同时管理有组织表格中的结构化数据,以及日益增长的非结构化数据(如图片、音频和文档)。传统上,联合分析这些多样化数据类型非常复杂,通常需要使用不同的工具。非结构化媒体通常需要导出到专门的服务进行处理(如图片分析需计算机视觉服务,音频需语音转文本引擎),这会造成数据孤岛,阻碍全局分析视角的建立。
以虚构的电商支持系统为例:结构化的工单信息存储在BigQuery表中,而相关的支持通话录音或损坏产品照片则存储在云对象存储中。如果没有直接关联,回答类似“找出所有指定笔记本型号的工单,其中通话音频表现出高度客户不满且照片显示屏幕破裂”这样的情境性问题,将变得繁琐且需多步操作。
本文是一份针对BigQuery中ObjectRef功能的实用技术指南,该功能旨在统一多模态数据分析。我们将探讨如何构建、查询和管理多模态数据集,使您能够通过熟悉的SQL和Python接口获得全面洞察。
第一部分:ObjectRef —— 统一多模态数据的关键
ObjectRef的结构与功能
为了解决数据孤岛的问题,BigQuery引入了ObjectRef,这是一种专用的STRUCT数据类型。ObjectRef作为对存储在Google Cloud Storage(GCS)中的非结构化数据对象的直接引用。它本身不包含非结构化数据(例如数据库中的base64编码图片或转录音频);而是指向数据位置,使BigQuery能够访问并在查询分析时整合这些数据。
ObjectRef结构体包含以下关键字段:
- uri(STRING):指向对象的GCS路径
- authorizer(STRING):使BigQuery能够安全访问GCS对象
- version(STRING):存储GCS对象的特定版本ID,绑定精确版本以实现可复现分析
- details(JSON):通常包含GCS元数据,如contentType或size
以下是ObjectRef值的JSON表示示例:
{"uri": "gs://cymbal-support/calls/ticket-83729.mp3","version": 1742790939895861,"authorizer": "my-project.us-central1.conn","details": {"gcs_metadata": {"content_type": "audio/mp3","md5_hash": "a1b2c3d5g5f67890a1b2c3d4e5e47890","size": 5120000,"updated": 1742790939903000}}
}
通过封装上述信息,ObjectRef为BigQuery提供了定位、访问以及理解GCS非结构化文件基本属性的全部必要细节。这为构建多模态表和数据帧奠定了基础,使结构化数据与非结构化内容引用并存。
创建多模态表
多模态表是包含一个或多个ObjectRef列的标准BigQuery表。本节介绍如何使用SQL创建这些表及填充数据。
您可以在创建新表时定义ObjectRef列,也可以将其添加到现有表中。这种灵活性可让您利用多模态能力调整当前数据模型。
使用对象表创建ObjectRef列
如果您有大量文件存储在GCS存储桶中,对象表是高效生成ObjectRef的方式。对象表是只读表,显示GCS目录内容,并自动包含名为ref的ObjectRef类型列。
CREATE EXTERNAL TABLE `project_id.dataset_id.my_table`
WITH CONNECTION `project_id.region.connection_id`
OPTIONS(object_metadata = 'SIMPLE',uris = ['gs://bucket-name/path/*.jpg']
);
输出结果为一个新表,包含ref列。您可以将ref列与如AI.GENERATE等函数一起使用,或与其它表连接查询。
以编程方式构建ObjectRef
对于更动态的工作流,您可以使用OBJ.MAKE_REF()函数以编程方式创建ObjectRef。常见做法是结合OBJ.FETCH_METADATA()函数,自动填充details元素中的GCS元数据。如果将gs://路径替换为现有表中的URI字段,以下代码同样适用。
SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://my-bucket/path/image.jpg', 'us-central1.conn')) AS customer_image_ref,OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://my-bucket/path/call.mp3', 'us-central1.conn')) AS support_call_ref
无论采用对象表还是OBJ.MAKE_REF,您均可构建和维护多模态表,为集成分析奠定基础。
第二部分:用SQL管理与分析多模态表
安全与合规访问
ObjectRef完美集成了BigQuery的原生安全特性,为多模态数据的治理提供了坚实基础。用户无法直接访问底层GCS对象,访问权限通过ObjectRef的authorizer字段指定的BigQuery连接资源来代理。这种模型实现了多层安全防护。
假设我们有一个电商产品图片多模态表,表中含有名为image
的ObjectRef列。
列级安全控制
- 列级安全:可对整列进行访问限制。例如,对于只需分析产品名称和评分的用户,管理员可以对
image
列施加列级安全策略,使这些分析师无法查询图片数据,但可分析其它结构化字段。
行级安全控制
- 行级安全:BigQuery允许根据规则过滤用户可见的行。例如,可设定“禁止用户查询与狗相关产品”的策略,被过滤的行对指定用户完全不可见。
多重授权者管理
- 多授权者机制:同一表的
image.authorizer
字段可以指定不同连接资源(如conn1
和conn2
),实现细粒度权限管理。比如,conn1
可访问公共图片桶,conn2
则访问新产品设计的受限桶。即使用户能查看所有行,是否能查询“Bird Seed”等产品的底层文件,完全取决于其对更高权限连接的授权情况。
用SQL实现AI驱动的生成式分析
AI.GENERATE_TABLE
函数可对多模态数据应用生成式AI模型,生成新的结构化表,非常适合大规模数据丰富任务。以下示例基于电商场景,利用产品名称和图片,为每个产品自动生成SEO关键词和市场描述。
SELECTproduct_id,seo_keywords,product_description
FROM AI.GENERATE_TABLE(MODEL `dataset_id.gemini`, (SELECT ('For the image of a pet product, generate:''1) 5 SEO search keywords and' '2) A one sentence product description', product_name, image_ref) AS prompt,product_idFROM `dataset_id.products_multimodal_table`),STRUCT("seo_keywords ARRAY, product_description STRING" AS output_schema)
);
运行结果是一个包含product_id
、seo_keywords
和product_description
的新结构化表。这一自动化流程极大提升了内容运营效率,生成的数据可直接用于内容管理系统或进一步分析。
第三部分:用Python和BigQuery DataFrames处理多模态数据
跨越Python与BigQuery,实现多模态智能推理
Python是数据科学家和分析师的首选语言,但面对超出本地内存的数据集时常遇到瓶颈。BigQuery DataFrames提供了解决方案——它通过pandas风格API,让你无需下载数据即可操作BigQuery中的大规模数据,并自动将Python代码转为SQL,在BigQuery引擎上执行。
这种方式自然支持多模态分析。你可以在一个DataFrame中同时表示结构化数据和非结构化文件引用,实现一体化加载、转换和分析。
创建多模态DataFrame
安装bigframes
库后,可用以下三种常见方式创建/指定blob列(即GCS文件引用列,Python端的ObjectRef):
import bigframes
import bigframes.pandas as bpd# 1. 从GCS路径直接创建blob列
df = bpd.from_glob_path("gs://cloud-samples-data/bigquery/tutorials/cymbal-pets/images/*", name="image")# 2. 从已存在的Object Table加载
df = bpd.read_gbq_object_table("", name="blob_col")# 3. 从DataFrame的URI字段生成blob列
df["blob_col"] = df["uri"].str.to_blob()
解释:
- GCS位置扫描:
from_glob_path
会扫描GCS目录,自动创建临时BigQuery对象表,并呈现为含blob列的DataFrame。 - 已存在对象表:如果已有对象表,直接用
read_gbq_object_table
加载,避免重复扫描。 - 已有DataFrame升级:如DataFrame中含GCS URI字符串列,可用
.str.to_blob()
方法“升级”为blob列。
AI驱动的Python多模态推理
创建多模态DataFrame的主要意义在于,可以直接在大规模非结构化数据上进行AI分析。BigQuery DataFrames支持在含有blob列的数据上调用大语言模型(LLM)等AI能力。
通用的多模态AI分析流程包含三步:
- 创建一个含有blob列(指向非结构化文件)的多模态DataFrame;
- 加载一个已训练好的BigQuery ML模型为BigFrames模型对象;
- 在模型对象上调用
.predict()
方法,将多模态DataFrame作为输入。
还是以电商场景为例,使用gemini-2.5-flash
模型为每个宠物产品图片生成一句简短描述:
import bigframes.pandas as bpd# 1. 从GCS位置创建多模态DataFrame
df_image = bpd.from_glob_path("gs://cloud-samples-data/bigquery/tutorials/cymbal-pets/images/*", name="image_blob"
)# 简化起见,仅取前2张图片
df_image = df_image.head(2)# 2. 指定大语言模型
from bigframes.ml import llmmodel = llm.GeminiTextGenerator(model_name="gemini-2.5-flash-preview-05-20")# 3. 让LLM为每张图片生成一句产品描述
answer = model.predict(df_image,prompt=["Write a 1 sentence product description for the image.", df_image["image_blob"]]
)answer[["ml_generate_text_llm_result", "image_blob"]]
当你调用model.predict(df_image)
时,BigQuery DataFrames会自动构建并执行一条SQL,调用ML.GENERATE_TEXT
函数,将blob列中的文件引用与文本提示作为输入传递给Gemini模型。BigQuery引擎处理请求,将生成的文本描述返回到结果DataFrame的新列中。
这种强大的集成方式,让你可以用极少的Python代码,实现数千乃至数百万份文件的多模态AI分析。
深入多模态DataFrame:更多处理能力
除了LLM生成外,bigframes
库还为blob列及相关方法提供了一系列非结构化数据处理与分析工具:
- 内置变换:支持常见图像操作(如模糊、归一化、缩放等),可大规模预处理图片,为建模做准备。
- 嵌入生成:通过Vertex AI托管模型等,一步生成多模态数据的embedding,便于后续语义检索等应用。
- PDF切分:自动将文档内容拆分为更小的有意义片段,简化RAG(检索增强生成)等场景的预处理。
这些特性让BigQuery DataFrames正不断发展为Python语境下端到端的多模态分析与AI平台。未来还会有更多传统上需独立库实现的功能,直接集成进bigframes。
结论
多模态表与数据帧代表了组织进行数据分析方式的转变。通过在BigQuery中建立结构化表数据与GCS中非结构化文件的直接、安全连接,彻底打破了长期困扰多模态分析的数据孤岛。
本指南展示了:无论你是写SQL的数据分析师,还是用Python的数据科学家,都可以优雅地将任意多模态文件与关系数据并行分析。
想要开启自己的多模态分析之旅,可参考以下资源:
- 官方文档:了解BigQuery多模态数据分析的概览
- Python Notebook:动手体验BigQuery DataFrames多模态分析的样例notebook
- 分步教程:
- 按照Multimodal SQL Tutorial学习SQL多模态分析
- 按照Multimodal DataFrames Tutorial体验Python多模态数据帧分析