使用查詢範本
資料擁有者和貢獻者可透過 BigQuery 資料無塵室查詢範本,發布經核准的查詢供訂閱者使用。預先定義這些查詢可降低資料外洩風險、確保分析結果一致,並簡化分析師的入門程序,即使他們不熟悉以隱私權為重的 SQL 也能輕鬆上手。
查詢範本會使用資料表值函式 (TVF),接受資料表或特定欄位做為參數,並傳回結果,不會公開原始資料。
限制
查詢範本有下列限制:
- 查詢範本最多支援兩個資料參照,也就是用來定義 TVF 查詢的資料,以及 TVF 接受的資料參數輸入。您可以在 TVF 的查詢定義中參照多個資料表或檢視區塊,但這些資料表或檢視區塊必須屬於同一個資料擁有者或當事人。
- 查詢範本 TVF 僅支援
TABLE和VIEW固定類型。 - 查詢範本定義須遵守與 TVF 相同的限制。
角色
使用資料無塵室查詢範本時,主要有三種角色。每個角色都有特定的工作流程,詳情請參閱本文:
範本建立者:定義要在資料無塵室中執行的查詢。這個角色等同於下列任一 Identity and Access Management (IAM) 角色:Analytics Hub 管理員、Analytics Hub 發布者或 Analytics Hub 清單管理員。詳情請參閱「範本建立者工作流程」。
範本核准者:資料擁有者,必須先核准查詢範本的參照,範本才能使用。這個角色類似於下列任一 IAM 角色:Analytics Hub 管理員、Analytics Hub 發布者或 Analytics Hub 清單管理員。詳情請參閱「範本核准者工作流程」。
範本訂閱者:訂閱資料無塵室的使用者,只能執行範本中核准的查詢。這個角色與 Analytics Hub 訂閱者 IAM 角色類似。詳情請參閱「範本訂閱者工作流程」。
事前準備
如要為 Google Cloud 專案啟用 Analytics Hub API,請選取下列其中一個選項:
控制台
前往 Google Cloud 控制台的「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 資料檢視者 (
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
這些預先定義的角色具備執行本文件所述工作所需的權限。如要查看確切的必要權限,請展開「Required permissions」(必要權限) 部分:
所需權限
您必須具備下列權限,才能執行本文件中的工作:
-
在資料無塵室中建立或刪除 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
-
專案的
-
更新現有查詢範本:
analyticshub.queryTemplates.update查詢範本 -
擷取查詢範本的詳細資料:
analyticshub.queryTemplates.get查詢範本 -
列出資料交換中的所有查詢範本:
analyticshub.queryTemplates.list在資料交換上 -
刪除查詢範本:在查詢範本上按一下
analyticshub.queryTemplates.delete
範本建立者工作流程
查詢範本建立者可以執行下列操作:
將產品資訊新增至資料無塵室
建立查詢範本前,請務必先將資料新增至資料無塵室。如要在資料無塵室中建立產品資訊,請按照下列步驟操作:
前往 Google Cloud 控制台的「Sharing (Analytics Hub)」頁面。
按一下要建立查詢範本的資料無塵室顯示名稱。
按一下「Add data」(新增資料),然後按照步驟建立已設定分析規則的檢視表。如需詳細操作說明,請參閱「建立產品資訊 (新增資料)」。
如要新增其他方的資料,請與其他信任的貢獻者共用資料無塵室。此外,資料提供者也必須將資料新增至資料無塵室,才能在查詢範本中使用。
為商家資訊設定資料輸出控制選項。
設定產品資訊的中繼資料控制項。如果只想分享上一步新增資料的結構定義和說明 (而非共用資料本身),請選取「Exclude access to listing from linked dataset」(排除連結資料集的清單存取權)。
查看商店資訊詳細資料。
按一下「新增資料」。資料無塵室現在包含您為資料建立的檢視表中繼資料。
將現有 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。LOCATION:資料無塵室的位置。CLEAN_ROOM_ID:資料無塵室 ID。LISTING_ID:房源 ID。PROJECT_ID:來源資料集所在專案的專案 ID。DATASET_ID:來源資料集 ID。ROUTINE_ID:日常安排 ID。LISTING_NAME:房源顯示名稱。
建立查詢範本
如要建立查詢範本,請選取下列任一選項:
控制台
前往 Google Cloud 控制台的「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。
- 使用支援的
查看範本詳細資料。
如要儲存範本,但不送審,請按一下「儲存」。 查詢範本的狀態現在會顯示為「DRAFT」。
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 { display_name: "DISPLAY_NAME", routine { definition_body: "QUERY_TEMPLATE_ID(TVF arguments) AS (TVF_DEFINITION)" } }'
更改下列內容:
DCR_PROJECT_ID:資料無塵室建立所在專案的專案 ID。LOCATION:資料無塵室的位置。CLEAN_ROOM_ID:資料無塵室 ID。QUERY_TEMPLATE_ID:查詢範本 ID。DISPLAY_NAME:查詢範本的顯示名稱。查詢範本建立後,即無法更新顯示名稱。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)
更新查詢範本
只有在查詢範本處於「草稿」狀態時,才能更新範本。查詢範本送審後即無法修改。
如要更新查詢範本,請選取下列其中一個選項:
控制台
前往 Google Cloud 控制台的「Sharing (Analytics Hub)」頁面。
按一下含有查詢範本的資料無塵室顯示名稱。
在資料無塵室中,前往「範本」分頁。
在要更新的範本列中,依序按一下 「Actions」(動作) >「Edit template」(編輯範本)。
視需要更新說明和主要聯絡人。
點選「下一步」。
查看範本詳細資料。
如要儲存範本,但不送審,請按一下「儲存」。
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=description" \ -d '{ "query_template": { "description": "New query template" } }'
更改下列內容:
DCR_PROJECT_ID:資料無塵室建立所在專案的專案 ID。LOCATION:資料無塵室的位置。CLEAN_ROOM_ID:資料無塵室 ID。QUERY_TEMPLATE_ID:查詢範本 ID。
將查詢範本送交審查
如要提交查詢範本進行審查,請選取下列其中一個選項:
控制台
前往 Google Cloud 控制台的「Sharing (Analytics Hub)」頁面。
按一下含有查詢範本的資料無塵室顯示名稱。
在資料無塵室中,前往「範本」分頁。
在要送審的範本資料列中,依序按一下 「Actions」(動作) >「Submit for review」(送審)。範本的狀態現在為「需要審查」。
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。
刪除查詢範本
只有在查詢範本處於「草稿」狀態時,才能刪除。查詢範本送審後即無法刪除。
如要刪除查詢範本,請選取下列其中一個選項:
控制台
前往 Google Cloud 控制台的「Sharing (Analytics Hub)」(共用 (Analytics Hub)) 頁面。
按一下含有查詢範本的資料無塵室顯示名稱。
在資料無塵室中,前往「範本」分頁。
在要刪除的範本資料列中,依序按一下 「Actions」(動作) >「Delete template」(刪除範本)。
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 只參照您的資料,用於單向共用,則可自行核准查詢範本。
核准查詢範本
如要核准查詢範本,請選取下列其中一個選項:
控制台
前往 Google Cloud 控制台的「Sharing (Analytics Hub)」頁面。
按一下含有查詢範本的資料無塵室顯示名稱。
在資料無塵室中,前往「範本」分頁。
在需要審查的範本資料列中,依序按一下 「核准狀態」 >「需要審查」。
按一下「核准」。
選取範本位置。這個位置是建立 TVF 以供分享的位置。
查看建議的查詢範本。
如要核准查詢範本,以便在資料無塵室中使用,請按一下「Approve」(核准)。
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,無法存取基礎共用資料。
訂閱查詢範本
如要訂閱查詢範本,請選取下列任一選項:
控制台
如要訂閱查詢範本,請訂閱資料無塵室。訂閱後,您就能存取所有已停用「排除連結資料集的清單存取權」設定的清單。
訂閱資料無塵室後,請按照下列步驟執行查詢範本:
前往 Google Cloud 控制台的「BigQuery」頁面。
在「Explorer」窗格中,前往您訂閱資料無塵室時建立的連結資料集。
開啟連結資料集中共用的常式或資料表值函式。
按一下「叫用資料表函式」。
將參數替換為可接受的輸入內容,也就是資料表名稱或欄位。
按一下「執行」。
如果無法在「Explorer」窗格中,將 TVF 巢狀結構視為連結資料集的子元素,可以直接在連結的資料集上查詢 TVF:
SELECT * FROM `my_project.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 `my_project.dcr_linked_dataset.mytvf`(TABLE myTable);
範例情境
您可以使用查詢範本,在資料無塵室中進行不同形式的資料協作。以下各節說明範例情境。
單向共用情境
資料發布者會建立查詢範本,讓訂閱合作夥伴只能執行發布者定義的查詢。查詢範本建立者會自行核准查詢範本,因為資料無塵室中沒有其他協作者。
在這個情境中,使用者 A 是資料無塵室擁有者,他建立名為 campaign_analysis 的資料無塵室,並新增名為 my_campaign 的資料集,其中包含 campaigns 資料表。使用者 A 設定匯總門檻政策和中繼資料控制項,因此只有中繼資料結構定義會顯示,且範本訂閱者無法存取來源資料。接著,使用者 A 從 campaigns 資料表定義 TVF,建立查詢範本,限制連結資料集的訂閱者只能執行 TVF。
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
);
由於使用者 A 具備 BigQuery 資料擁有者角色,因此擁有 campaigns 資料表的適當權限,使用者 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 現在可以查看資料表的結構定義,提出各種查詢範本,將自己的資料加入該資料表。transactions以下是 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 my_project.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 無須將資料新增至資料無塵室。
定價
下表匯總 BigQuery 資料無塵室查詢範本的定價:
| 角色 | 定價詳細資料 |
|---|---|
| 資料貢獻者 | 只會收取資料儲存費用。 |
| 範本訂閱者 | 執行查詢時,只需支付運算 (分析) 費用。 |
後續步驟
- 如要進一步瞭解資料無塵室,請參閱「使用資料無塵室分享機密資料」。
- 如要進一步瞭解訂閱項目,請參閱「訂閱資料無塵室」。
- 如要進一步瞭解 TVF,請參閱「資料表函式」。
- 如要進一步瞭解 BigQuery 共用資料集的資料輸出,請參閱「資料輸出選項」。