在資料表結構定義中指定 ObjectRef 資料欄
ObjectRef 欄可讓您將非結構化資料整合至 BigQuery 標準資料表,方法是儲存 Cloud Storage 中物件的中繼資料和連線資訊。舉例來說,在產品資料表中,您可以將每張產品圖片與其他產品資訊儲存在同一列。
本文說明如何定義資料表結構定義,其中 STRUCT 欄使用 ObjectRef 格式。如要進一步瞭解如何處理多模態資料,請參閱「分析多模態資料」和「使用 SQL 分析多模態資料」教學課程。
必要條件
如要在標準資料表中填入及更新 ObjectRef 值,資料表必須有 STRING 欄,其中包含相關 Cloud Storage 物件的 URI 資訊。
您必須擁有 Cloud Storage bucket,其中包含與目標標準資料表 URI 資料中識別的相同物件。
維持 ObjectRef 值
您建立的任何物件資料表都有 ref 欄,其中包含指定物件的 ObjectRef 值。如果您已有物件資料表,可以將其與標準資料表的物件 URI 欄彙整,填入及更新 ObjectRef 值。這種做法更有效率,因為可以避免從 Cloud Storage 重新擷取中繼資料,建立新的 ObjectRef 值。
同樣地,如果您已有物件中繼資料的儲存空間分析資料集,則可使用 ref.uri 或 selfLink 資料欄,將標準資料表與儲存空間分析資料集彙整,以填入及更新 ObjectRef 值。在 Storage Insights 資料集中建立的任何 ObjectRef 值都沒有授權者。如要查詢這些物件,您必須具備物件的直接存取權,或在 ObjectRef 中新增授權者,以便使用委派存取權。
如果沒有現成的物件資料表或儲存空間分析資料集,可以使用 OBJ.MAKE_REF 函式,直接從 Cloud Storage 擷取物件中繼資料,填入及更新 ObjectRef 值。這種做法需要從 Cloud Storage 擷取物件中繼資料,因此擴充性可能較低。
建立ObjectRef資料欄
您可以使用ObjectRef 格式 (即 STRUCT<uri STRING, version STRING, authorizer STRING, details JSON>),將 ObjectRef 值儲存在 STRUCT 資料欄中。
如要在標準資料表中建立 ObjectRef 資料欄並填入資料,請選取下列其中一個選項:
SQL 函式
根據 OBJ.MAKE_REF 函式的輸出內容,建立並填入 ObjectRef 資料欄:
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中輸入下列陳述式:
CREATE OR REPLACE TABLE PROJECT_ID.DATASET_ID.TABLE_NAME AS SELECT TABLE_NAME.*, OBJ.MAKE_REF(uri, 'CONNECTION_ID') AS objectrefcolumn FROM DATASET_ID.TABLE_NAME;
替換下列內容:
PROJECT_ID:您的專案 ID。如果您是在目前的專案中建立資料表,則可略過這個引數。DATASET_ID:您要建立的資料集 ID。TABLE_NAME:要重新建立的標準資料表名稱。CONNECTION_ID:STRING值,包含服務可用來存取 Cloud Storage 中物件的 Cloud 資源連結,格式為location.connection_id。例如:us-west1.myconnection。如要取得連線 ID,請在 Google Cloud 控制台中查看連線詳細資料,然後複製「Connection ID」中顯示的完整連線 ID 最後一個部分的值。例如:projects/myproject/locations/connection_location/connections/myconnection。您必須將 Storage 物件使用者 (
roles/storage.objectUser) 角色,授予連線的服務帳戶,才能使用該帳戶存取 Cloud Storage bucket 中的物件。連線必須與呼叫函式的查詢位於相同專案和區域。
按一下「 執行」。
如要進一步瞭解如何執行查詢,請參閱「執行互動式查詢」。
物件資料表
根據物件資料表 ref 欄中的資料,建立 ObjectRef 欄並填入資料:
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中輸入下列陳述式:
CREATE OR REPLACE TABLE PROJECT_ID.DATASET_ID.TABLE_NAME AS SELECT TABLE_NAME.*, OBJECT_TABLE.ref AS objectrefcolumn FROM DATASET_ID.TABLE_NAME INNER JOIN DATASET_ID.OBJECT_TABLE ON OBJECT_TABLE.uri = TABLE_NAME.uri;
替換下列內容:
PROJECT_ID:您的專案 ID。如果您是在目前的專案中建立資料表,則可略過這個引數。DATASET_ID:您要建立的資料集 ID。TABLE_NAME:要重新建立的標準資料表名稱。OBJECT_TABLE:物件資料表的名稱,其中包含要整合至標準資料表的物件資料。
按一下「 執行」。
如要進一步瞭解如何執行查詢,請參閱「執行互動式查詢」。
建立ARRAY<ObjectRef>資料欄
您可以建立 ARRAY<STRUCT<uri STRING, version STRING, authorizer STRING, details JSON>> 資料欄,其中包含 ObjectRef 值陣列。舉例來說,您可以將影片切成獨立圖片,然後將這些圖片儲存為 ObjectRef 值陣列。
您可以使用 ARRAY_AGG 函式匯總 ObjectRef 值陣列,包括視需要使用 ORDER BY 子句保留物件順序。您可以使用 UNNEST 運算子將 ObjectRef 值陣列剖析為個別 ObjectRef 值,包括視需要使用 WITH OFFSET 子句保留物件順序。您可以使用物件中繼資料 (例如 URI 路徑和物件檔案名稱),將代表物件區塊的 ObjectRef 值對應至代表原始物件的 ObjectRef 值。
如要查看如何處理 ObjectRef 值陣列的範例,請參閱「使用 SQL 分析多模態資料」教學課程的「使用 ARRAY<ObjectRef> 值處理排序的多模態資料」一節。
更新 ObjectRef 欄
如要更新標準資料表中的 ObjectRef 資料欄,請選取下列其中一個選項:
物件資料表
使用物件資料表 ref 欄中的資料,更新 ObjectRef 欄:
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中輸入下列陳述式:
UPDATE PROJECT_ID.DATASET_ID.TABLE_NAME SET objectrefcolumn = (SELECT ref FROM DATASET_ID.OBJECT_TABLE WHERE OBJECT_TABLE.uri = TABLE_NAME.uri) WHERE uri != "";
替換下列內容:
PROJECT_ID:您的專案 ID。如果您是在目前的專案中建立資料表,則可略過這個引數。DATASET_ID:您要建立的資料集 ID。TABLE_NAME:要重新建立的標準資料表名稱。OBJECT_TABLE:物件資料表的名稱,其中包含與標準資料表ObjectRef欄相同的物件資料。
按一下「 執行」。
如要進一步瞭解如何執行查詢,請參閱「執行互動式查詢」。
SQL 函式
使用 OBJ.FETCH_METADATA 和 OBJ.MAKE_REF 函式的輸出內容,更新 ObjectRef 欄:
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中輸入下列陳述式:
UPDATE PROJECT_ID.DATASET_ID.TABLE_NAME SET objectrefcolumn = (SELECT OBJ.MAKE_REF(uri, 'CONNECTION_ID')) WHERE uri != "";
替換下列內容:
PROJECT_ID:您的專案 ID。如果您是在目前的專案中建立資料表,則可略過這個引數。DATASET_ID:您要建立的資料集 ID。TABLE_NAME:要重新建立的標準資料表名稱。CONNECTION_ID:STRING值,包含服務可用來存取 Cloud Storage 中物件的 Cloud 資源連結,格式為location.connection_id。例如:us-west1.myconnection。如要取得連線 ID,請在 Google Cloud 控制台中查看連線詳細資料,然後複製「Connection ID」中顯示的完整連線 ID 最後一個部分的值。例如:projects/myproject/locations/connection_location/connections/myconnection。您必須將 Storage 物件使用者 (
roles/storage.objectUser) 角色,授予連線的服務帳戶,才能使用該帳戶存取 Cloud Storage bucket 中的物件。連線必須與呼叫函式的查詢位於相同專案和區域。
按一下「 執行」。
如要進一步瞭解如何執行查詢,請參閱「執行互動式查詢」。