引言
企業需要同時管理有組織表格中的結構化數據,以及日益增長的非結構化數據(如圖片、音頻和文檔)。傳統上,聯合分析這些多樣化數據類型非常復雜,通常需要使用不同的工具。非結構化媒體通常需要導出到專門的服務進行處理(如圖片分析需計算機視覺服務,音頻需語音轉文本引擎),這會造成數據孤島,阻礙全局分析視角的建立。
以虛構的電商支持系統為例:結構化的工單信息存儲在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多模態數據幀分析