使用查詢範本
BigQuery 資料無塵室查詢範本可加速取得洞察資料,並提供額外的安全防護和控管機制,盡量減少資料外洩疑慮。預先定義並限制可在資料無塵室執行的查詢,有助於:
防止機密資料外洩。如果允許在無塵室中執行查詢的訂閱者有更大的探索彈性,資料擁有者會認為機密資訊意外或有意外洩的風險較高。
簡化新手上路和採用程序,方便不熟悉技術的使用者。許多資料供應商認為,資料無塵室的訂閱者技術能力較弱,尤其是在編寫以隱私權為重的 SQL 查詢,以及瞭解如何適當分配隱私權預算方面。
確保資料訂閱者獲得一致的分析結果。如果無法控管在資料無塵室中執行的查詢,就更難以強制執行特定資料分析規則,以及驗證是否符合隱私權法規。
資料擁有者和共同參與者可以透過查詢範本,建立預先定義且經過核准的查詢,專門用於資料淨室的使用案例,並發布這些查詢供訂閱者使用。預先定義的查詢會使用 BigQuery 中的資料表值函式 (TVF),允許將整個資料表或特定欄位做為輸入參數傳遞,並傳回資料表做為輸出。
限制
- 查詢範本最多只支援兩個資料參照,也就是用來定義 TVF 查詢的資料,以及 TVF 接受的資料參數輸入內容。
- 您可以在 TVF 的查詢定義中參照多個資料表或檢視區塊,但這些項目必須屬於同一資料擁有者或當事人。
- 查詢範本 TVF 僅支援
TABLE
和VIEW
固定類型。 - 查詢範本定義須遵守與 TVF 相同的限制。
事前準備
按照下列步驟,為 Google Cloud 專案啟用 Analytics Hub API:
主控台
前往 Analytics Hub API 頁面。
在 Google Cloud 控制台工具列中選取專案。
如果 API 尚未啟用,請點選「啟用」。
bq
gcloud services enable analyticshub.googleapis.com
必要的角色
如要取得執行本文工作所需的權限,請要求管理員授予下列 IAM 角色:
-
在資料無塵室中建立或刪除 TVF:
-
Analytics Hub 發布者 (
roles/analyticshub.publisher
) 專案 -
Analytics Hub 訂閱者 (
roles/analyticshub.subscriber
) 專案
-
Analytics Hub 發布者 (
-
授權 TVF:
專案的 BigQuery 資料擁有者 (
roles/bigquery.dataOwner
) -
在資料無塵室中新增、更新或刪除 TVF 刊登:
-
Analytics Hub 發布者 (
roles/analyticshub.publisher
) 專案 -
Analytics Hub 訂閱者 (
roles/analyticshub.subscriber
) 專案
-
Analytics Hub 發布者 (
-
建立查詢範本:
-
Analytics Hub 發布者 (
roles/analyticshub.publisher
) 專案 -
Analytics Hub 訂閱者 (
roles/analyticshub.subscriber
) 專案
-
Analytics Hub 發布者 (
-
核准查詢範本:
-
Analytics Hub 發布者 (
roles/analyticshub.publisher
) 專案 -
專案的 BigQuery 資料擁有者 (
roles/bigquery.dataOwner
)
-
Analytics Hub 發布者 (
-
訂閱含有查詢範本的資料無塵室:
-
Analytics Hub 訂閱者 (
roles/analyticshub.subscriber
) 專案 -
Analytics Hub 訂閱項目擁有者 (
roles/analyticshub.subscriptionOwner
) 在要訂閱資料無塵室的專案中
-
Analytics Hub 訂閱者 (
-
執行查詢範本中定義的查詢:
-
專案的 BigQuery 資料檢視者 (
roles/bigquery.dataViewer
) -
BigQuery 使用者 (
roles/bigquery.user
) 專案
-
專案的 BigQuery 資料檢視者 (
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
這些預先定義的角色具備執行本文中工作所需的權限。如要查看確切的必要權限,請展開「必要權限」部分:
所需權限
如要執行本文中的工作,必須具備下列權限:
-
在資料無塵室中建立或刪除 TVF:
-
專案的
bigquery.routines.create
-
專案的
bigquery.routines.update
-
專案的
bigquery.routines.delete
-
專案的
-
授權 TVF:
bigquery.datasets.update
處理常式存取的資料集 -
建立查詢範本:
-
專案的
analyticshub.listings.subscribe
-
專案的
analyticshub.queryTemplates.create
-
專案的
-
核准查詢範本:
-
專案的
bigquery.routines.create
-
bigquery.datasets.update
處理常式存取的資料集 -
專案的
analyticshub.listings.create
-
專案的
analyticshub.queryTemplates.approve
-
專案的
將現有 TVF 新增至資料無塵室
您可以使用 Analytics Hub API,將現有的 TVF 新增至資料無塵室。
請使用 projects.locations.dataExchanges.listings.create
方法。
以下範例說明如何使用 curl
指令呼叫 projects.locations.dataExchanges.listings.create
方法:
curl -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Content-Type: application/json" -H 'x-goog-user-project:DCR_PROJECT_ID' -X POST https://analyticshub.googleapis.com/v1/projects/DCR_PROJECT_ID/locations/LOCATION/dataExchanges/CLEAN_ROOM_ID/listings?listingId=LISTING_ID -d '{"bigqueryDataset":{"dataset":"projects/PROJECT_ID/datasets/DATASET_ID","selectedResources":[{"routine":"projects/PROJECT_ID/datasets/DATASET_ID/tables/ROUTINE_ID"}],},"displayName":LISTING_NAME"}'
更改下列內容:
DCR_PROJECT_ID
:建立資料淨室的專案 ID。PROJECT_ID
:來源資料集所屬專案的專案 ID。DATASET_ID
:來源資料集 ID。LOCATION
:資料無塵室的位置。CLEAN_ROOM_ID
:資料無塵室 ID。LISTING_ID
:房源 ID。LISTING_NAME
:房源名稱。ROUTINE_ID
:日常安排 ID。
查詢範本角色
使用資料無塵室查詢範本時,主要有三種角色。每個角色都有特定的工作流程,本文稍後會說明。
範本建立者:定義要在資料無塵室中執行的查詢。這個角色等同於下列任一角色: Analytics Hub 管理員、 Analytics Hub 發布者或 Analytics Hub 項目管理員。 詳情請參閱範本建立者工作流程。
範本核准者:資料擁有者,必須先核准查詢範本的參照,範本才能供人使用。這個角色等同於下列任一角色: Analytics Hub 管理員、 Analytics Hub 發布者 或 Analytics Hub 項目管理員。 詳情請參閱範本核准者工作流程。
範本訂閱者:訂閱資料無塵室的使用者,只能執行範本中核准的查詢。這個角色類似於「Analytics Hub 訂閱者」角色。詳情請參閱範本訂閱者工作流程。
範本建立者工作流程
查詢範本建立者可以執行下列操作:
將房源新增至資料無塵室
建立查詢範本前,您必須先將資料新增至資料無塵室。如要在資料無塵室中建立商家資訊,請按照下列步驟操作:
前往「Sharing (Analytics Hub)」頁面。
按一下要在其中建立查詢範本的資料淨室顯示名稱。
按一下「新增資料」,然後按照步驟建立已設定分析規則的檢視畫面。如需詳細操作說明,請參閱「建立房源資訊 (新增資料)」一文。
- 如要新增其他方的資料,請與其他信任的貢獻者共用資料無塵室。此外,資料貢獻者也必須將資料新增至資料無塵室,才能在查詢範本中使用。
為房源設定資料外流控管機制。
設定房源的後設資料控制選項。如果只想分享上一步驟中新增資料的結構定義和說明 (而非分享資料本身),請選取「排除連結資料集的商家資訊存取權」。
查看房源詳細資料。
按一下「新增資料」。現在,為資料建立的檢視區塊中繼資料已新增至資料無塵室。
建立查詢範本
選取下列選項之一:
主控台
前往「Sharing (Analytics Hub)」頁面。
按一下要建立查詢範本的資料無塵室顯示名稱。
在淨室中,前往「範本」分頁。
按一下「建立範本」。
輸入範本名稱和說明。
點選「下一步」。
您可以查看新增至資料無塵室的檢視表架構,並提議查詢定義。
- 請務必使用支援的
CREATE TABLE FUNCTION
語法定義查詢。 傳遞整個資料表或檢視區塊,並使用固定定義。您必須定義完整的資料表路徑參照,包括專案 ID 和資料集 ID,這些資料來自新增至無塵室的資料。例如:
query_template1(t1 TABLE<year INT64>) AS (SELECT * FROM `project_id.dataset_id.table_id` WHERE year = table_id.year)
如果您已對資料套用隱私權分析規則,請務必確認這個 TVF 包含隱私權專屬的 SQL 語法,例如
SELECT WITH AGGREGATION_THRESHOLD
。
- 請務必使用支援的
查看範本詳細資料。
如要儲存範本但不送審,請按一下「儲存」。 查詢範本現在的狀態為「草稿」。
API
下列範例說明如何使用 CURL
指令建立查詢範本:
curl -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Content-Type: application/json" -H 'x-goog-user-project:DCR_PROJECT_ID' -X POST https://analyticshub.googleapis.com/v1/projects/DCR_PROJECT_ID/locations/LOCATION/dataExchanges/CLEAN_ROOM_ID/queryTemplates?queryTemplateId=QUERY_TEMPLATE_ID -d 'query_template { name: "query_template1", display_name: "query_template1", routine { definition_body: "QUERY_TEMPLATE_ID(TVF arguments) AS (TVF_DEFINITION)" } }'
更改下列內容:
DCR_PROJECT_ID
:建立資料淨室的專案 ID。LOCATION
:資料無塵室的位置。CLEAN_ROOM_ID
:資料無塵室 ID。QUERY_TEMPLATE_ID
:查詢範本 ID。TVF_DEFINITION
:TVF 定義。
下列程式碼範例顯示 API 呼叫的 definition_body
範例。
您必須定義完整的資料表路徑參照,包括專案 ID 和資料集 ID,這些資料來自加入淨室的資料。
query_template1(t1 TABLE<year INT64>) AS (SELECT * FROM `project_id.dataset_id.table_id` WHERE year = table_id.year)
definition_body
類似於常式的定義。上述 definition_body
會轉譯為下列常式:
CREATE OR REPLACE TABLE FUNCTION <approvers_dataset>.query_template1(t1 TABLE, y INT64)
AS (SELECT * FROM t1 WHERE year > y)
更新查詢範本
只有在查詢範本處於「草稿」狀態時,才能更新。如果查詢範本已送審,就無法再修改。
如要更新查詢範本,請選取下列其中一個選項:
主控台
前往「Sharing (Analytics Hub)」頁面。
按一下含有查詢範本的資料無塵室顯示名稱。
在淨室中,前往「範本」分頁。
找出要更新的範本所在的列,然後依序按一下「動作」>「編輯範本」。
視需要更新範本詳細資料和查詢定義。
點選「下一步」。
檢查查詢範本,然後按一下「儲存」,即可儲存變更,不必將範本送審。
API
以下範例說明如何使用 CURL
指令更新查詢範本:
curl -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Content-Type: application/json" -H 'x-goog-user-project:DCR_PROJECT_ID' -X PATCH https://analyticshub.googleapis.com/v1/projects/DCR_PROJECT_ID/locations/LOCATION/dataExchanges/CLEAN_ROOM_ID/queryTemplates/QUERY_TEMPLATE_ID?updateMask=display_name -d 'query_template { display_name: "query_template1" }'
更改下列內容:
DCR_PROJECT_ID
:建立資料淨室的專案 ID。LOCATION
:資料無塵室的位置。CLEAN_ROOM_ID
:資料無塵室 ID。QUERY_TEMPLATE_ID
:查詢範本 ID。
將查詢範本送交審查
選取下列選項之一:
主控台
前往「Sharing (Analytics Hub)」頁面。
按一下含有查詢範本的資料無塵室顯示名稱。
在淨室中,前往「範本」分頁。
在要送審的範本資料列中,依序按一下「動作」>「送審」。範本的狀態現在為「需要審查」。
API
以下範例說明如何使用 CURL
指令,提交查詢範本以供審查:
curl -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Content-Type: application/json" -H 'x-goog-user-project:DCR_PROJECT_ID' -X POST https://analyticshub.googleapis.com/v1/projects/DCR_PROJECT_ID/locations/LOCATION/dataExchanges/CLEAN_ROOM_ID/queryTemplates/QUERY_TEMPLATE_ID:submit
更改下列內容:
DCR_PROJECT_ID
:建立資料淨室的專案 ID。LOCATION
:資料無塵室的位置。CLEAN_ROOM_ID
:資料無塵室 ID。QUERY_TEMPLATE_ID
:查詢範本 ID。
刪除查詢範本
只有處於「草稿」狀態的查詢範本才能刪除。如果查詢範本已送交審查,就無法再刪除。
選取下列選項之一:
主控台
前往「Sharing (Analytics Hub)」頁面。
按一下含有查詢範本的資料無塵室顯示名稱。
在淨室中,前往「範本」分頁。
在要刪除的範本所在資料列中,依序按一下「動作」>「刪除範本」。
API
下列範例說明如何使用 CURL
指令刪除查詢範本:
curl -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Content-Type: application/json" -H 'x-goog-user-project:DCR_PROJECT_ID' -X DELETE https://analyticshub.googleapis.com/v1/projects/DCR_PROJECT_ID/locations/LOCATION/dataExchanges/CLEAN_ROOM_ID/queryTemplates?queryTemplateId=QUERY_TEMPLATE_ID
更改下列內容:
DCR_PROJECT_ID
:建立資料淨室的專案 ID。LOCATION
:資料無塵室的位置。CLEAN_ROOM_ID
:資料無塵室 ID。QUERY_TEMPLATE_ID
:查詢範本 ID。
範本核准者工作流程
查詢範本核准者可以核准查詢範本。
如果 TVF 參照的資料不屬於您 (例如其他投稿者的資料),只有該資料的擁有者可以核准查詢範本。如果您要建立的 TVF 只會參照您的資料 (用於單向共用),可以自行核准查詢範本。
核准查詢範本
選取下列選項之一:
主控台
前往「Sharing (Analytics Hub)」頁面。
按一下含有查詢範本的資料無塵室顯示名稱。
在淨室中,前往「範本」分頁。
找出需要審查的範本所在的列,然後依序點選「核准狀態」>「需要審查」。
按一下「核准」。
選取範本位置。這個位置是建立 TVF 以供分享的位置。
查看建議的查詢範本。
如果查詢範本已核准,可在資料無塵室中使用,請按一下「核准」。
API
使用
jobserver.query
呼叫,從查詢範本建立常式:curl -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Content-Type: application/json" -L -X POST https://bigquery.googleapis.com/bigquery/v2/projects/ROUTINE_PROJECT_ID/queries --data '{"query":"ROUTINE_CREATION_QUERY","useLegacySql":false}'
更改下列內容:
ROUTINE_PROJECT_ID
:建立常式的專案 ID。ROUTINE_CREATION_QUERY
:建立常式的查詢。
將建立的例行程序新增至資料無塵室:
curl -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Content-Type: application/json" -H 'x-goog-user-project:DCR_PROJECT_ID' -X POST https://analyticshub.googleapis.com/v1/projects/DCR_PROJECT_ID/locations/LOCATION/dataExchanges/CLEAN_ROOM_ID/listings?listingId=LISTING_ID -d '{"bigqueryDataset":{"dataset":"projects/PROJECT_ID/datasets/DATASET_ID","selectedResources":[{"routine":"projects/PROJECT_ID/datasets/DATASET_ID/tables/ROUTINE_ID"}],},"displayName":"LISTING_NAME"}'
更改下列內容:
DCR_PROJECT_ID
:建立資料淨室的專案 ID。LOCATION
:資料無塵室的位置。CLEAN_ROOM_ID
:資料無塵室 ID。LISTING_ID
:房源 ID。PROJECT_ID
:來源資料集所屬專案的專案 ID。DATASET_ID
:來源資料集 ID。ROUTINE_ID
:日常安排 ID。LISTING_NAME
:房源名稱。
將查詢範本狀態更新為「
APPROVED
」:curl -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Content-Type: application/json" -L -X POST https://analyticshub.googleapis.com/v1/projects/DCR_PROJECT_ID/locations/LOCATION/dataExchanges/CLEAN_ROOM_ID/queryTemplates/QUERY_TEMPLATE_ID:approve --data '{}'
更改下列內容:
DCR_PROJECT_ID
:建立資料淨室的專案 ID。LOCATION
:資料無塵室的位置。CLEAN_ROOM_ID
:資料無塵室 ID。QUERY_TEMPLATE_ID
:查詢範本 ID。
拒絕查詢範本
在 Google Cloud 控制台中,您可以透過下列方式拒絕查詢範本:
- 請勿核准提交的查詢範本審查。
- 刪除查詢範本,即可從淨室中移除。
範本訂閱者工作流程
查詢範本訂閱者可以查看及訂閱資料無塵室。如果只將查詢範本新增至資料無塵室,訂閱資料無塵室只會授予對應 TVF 的存取權,不會授予基礎共用資料的存取權。
訂閱查詢範本
選取下列選項之一:
主控台
如要訂閱查詢範本,請訂閱資料無塵室。系統會授予所有已停用「排除連結資料集中的清單存取權」設定的清單存取權。
如要訂閱查詢範本,請按照下列步驟操作:
前往「BigQuery」頁面
前往您在訂閱資料無塵室時建立的連結資料集。
開啟已連結資料集中共用的常式或 TVF。
按一下「叫用資料表函式」。
將參數替換為可接受的輸入內容,也就是資料表名稱或欄位。
按一下「執行」。
如果無法在「Explorer」面板中,將 TVF 巢狀結構視為連結資料集的子項元素,可以直接在連結資料集上查詢 TVF:
SELECT * FROM `myproject.dcr_linked_dataset.mytvf`(TABLE myTable);
API
請使用 projects.locations.dataExchanges.subscribe
方法。
以下範例說明如何使用 curl
指令呼叫 projects.locations.dataExchanges.subscribe
方法:
curl -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Content-Type: application/json" -L -X POST https://analyticshub.googleapis.com/v1/projects/DCR_PROJECT_ID/locations/LOCATION/dataExchanges/CLEAN_ROOM_ID:subscribe --data '{"destination":"projects/SUBSCRIBER_PROJECT_ID/locations/LOCATION","subscription":"SUBSCRIPTION"}'
更改下列內容:
DCR_PROJECT_ID
:建立資料淨室的專案 ID。LOCATION
:資料無塵室的位置。CLEAN_ROOM_ID
:資料無塵室 ID。SUBSCRIBER_PROJECT_ID
:訂閱端專案的專案 ID。SUBSCRIPTION
:訂閱方案名稱。
訂閱查詢範本後,您就能直接在連結的資料集上查詢 TVF:
SELECT * FROM `myproject.dcr_linked_dataset.mytvf`(TABLE myTable);
範例情境
查詢範本可用於促進資料無塵室內不同形式的資料協作。下列各節說明範例情境。
單向分享情境
資料發布者會建立查詢範本,確認訂閱合作夥伴只能執行發布者定義的查詢。由於沒有其他參與者加入淨室,查詢範本建立者最終會自行核准查詢範本。
在這個情境中,使用者 A 是資料無塵室擁有者,他建立名為 campaign_analysis
的資料無塵室,並新增名為 my_campaign
的資料集,其中包含 campaigns
資料表。使用者 A 設定匯總門檻政策和中繼資料控制項,確認只有中繼資料架構可見,訂閱者無法存取來源資料。使用者 A 接著從 campaigns
資料表定義資料表值函式,藉此建立查詢範本,並限制連結資料集的所有訂閱者只能執行 TVF。
TVF 語法如下:
campaigns_template(t1 TABLE campaign_ID <STRING> ) AS (
SELECT WITH AGGREGATION_THRESHOLD company_id, company, sum(impressions) FROM myproject.my_campaign.campaigns
group by company_id, company
);
由於使用者 A 具有 BigQuery 資料擁有者角色,因此擁有廣告活動資料表的適當權限,提交查詢範本以供審查後,使用者 A 就能立即自行核准。
多方協作共用
無塵室擁有者會邀請信任的合作夥伴提議要對彼此的資料執行的查詢。雙方只能查看中繼資料結構定義,無法存取基礎共用資料,因此可安全地提出查詢。如果查詢定義參照的資料不屬於範本提案者,只有該資料的擁有者可以核准範本。
在這個情境中,使用者 A 邀請使用者 B (資料無塵室貢獻者) 加入campaign_analysis
無塵室。使用者 B 想要查看 campaigns
資料表的中繼資料結構定義,藉此提議查詢範本,將自己的資料與該資料表彙整。
TVF 語法如下:
campaigns_template(t1 TABLE campaign_ID <STRING> ) AS (
SELECT WITH AGGREGATION_THRESHOLD company_id, company, sum(impressions) FROM my_project.my_campaign.campaigns
group by company_id, company
);
由於使用者 B 並未新增 campaigns
資料表,也不擁有該資料表,因此查詢範本送交核准後,只有使用者 A 可以核准。如要使用查詢範本,使用者 B 必須訂閱資料無塵室並叫用 TVF。使用者 B 會將自己的資料表 (其中包含名為 campaign_ID
的欄位) 做為資料表參數傳遞,並執行查詢範本中定義的私有 SQL。請注意,使用者 B 無須將資料新增至資料無塵室。
使用者 B 也將名為 my_transactions
的資料集新增至資料無塵室,其中包含 transactions
和 products
資料表。使用者 B 設定匯總門檻政策和中繼資料控制項,確認只有中繼資料架構可見,訂閱者無法存取來源資料。
使用者 A 現在可以查看資料表的結構定義中繼資料,提出各種查詢範本,將自己的資料加入交易資料表。以下是 TVF 語法的範例:
transactions_template(t1 TABLE user_ID <STRING> ) AS (
SELECT WITH AGGREGATION_THRESHOLD company_id, company, campaign_id, sku, category, date, sum(amount) FROM my_project.my_transactions.transactions
group by company_id, company, campaign_id, sku, category, date
);
transactions_template_with_join(t1 TABLE user_ID <STRING> ) AS (
SELECT WITH AGGREGATION_THRESHOLD t.company_id, t.company, t.campaign_id, t.sku, t.date, p.product_name, p.product_category, sum(t.amount) FROM myproject.my_transactions.transactions t
left join my_project.my_transactions.products p
on t.product_id = p.product_id
group by t.company_id, t.company, t.campaign_id, t.sku, t.date, p.product_name, p.product_category
);
由於使用者 A 並未新增 transactions
和 products
資料表,也不擁有這些資料表,因此查詢範本送交核准後,只有使用者 B 可以核准。如要使用查詢範本,使用者 A 必須訂閱無塵室並叫用 TVF。使用者 A 會傳遞自己的資料表 (其中包含名為 user_ID
的欄位) 做為資料表參數,並執行查詢範本中定義的隱私權 SQL。請注意,使用者 A 無須將資料新增至資料無塵室。
定價
使用查詢範本的資料貢獻者只需支付資料儲存費用。
使用查詢範本的訂閱者執行查詢時,只會收取運算 (分析) 費用。
後續步驟
- 如要進一步瞭解資料無塵室,請參閱「使用資料無塵室分享機密資料」。
- 如要進一步瞭解訂閱項目,請參閱「訂閱資料無塵室」。
- 如要進一步瞭解 TVF,請參閱「資料表函式」。
- 如要進一步瞭解資料輸出,請參閱「資料輸出選項 (僅限 BigQuery 共用資料集)」。