使用查詢範本

資料擁有者和貢獻者可透過 BigQuery 資料無塵室查詢範本,發布經核准的查詢供訂閱者使用。預先定義這些查詢可盡量降低資料竊取風險、確保分析結果一致,並簡化不熟悉隱私權導向 SQL 的分析師的入門流程。

查詢範本會使用資料表值函式 (TVF) 接受資料表或特定欄位做為參數,並傳回結果,不會公開原始資料。

限制

查詢範本有下列限制:

  • 查詢範本最多支援兩個資料參照,也就是用來定義 TVF 查詢的資料,以及 TVF 接受的資料參數輸入。您可以在 TVF 的查詢定義中參照多個資料表或檢視表,但這些資料表或檢視表必須屬於同一個資料擁有者或方。
  • 查詢範本 TVF 僅支援 TABLE 和 VIEW 固定類型。
  • 查詢範本定義受限於與 TVF 相同的限制。

角色

使用資料無塵室查詢範本時,主要有三種角色。每個角色都有特定的工作流程,本文將說明這些流程:

事前準備

如要為 Google Cloud 專案啟用 Analytics Hub API,請選取下列其中一個選項:

控制台

  1. 前往 Google Cloud 控制台的「Analytics Hub API」頁面。

    前往 Analytics Hub API

  2. 在 Google Cloud 控制台工具列中選取專案。

  3. 如果 API 尚未啟用,請點選「啟用」。

gcloud

執行 gcloud services enable 指令:

gcloud services enable analyticshub.googleapis.com

必要的角色

如要取得執行本文件所述工作所需的權限,請要求管理員授予您下列 IAM 角色:

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

這些預先定義的角色具備執行本文件所述工作所需的權限。如要查看確切的必要權限,請展開「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

您或許還可透過自訂角色或其他預先定義的角色取得這些權限。

範本建立者工作流程

查詢範本建立者可以執行下列操作:

將產品資訊新增至資料無塵室

建立查詢範本前,請先將資料新增至資料無塵室。如要在資料無塵室中建立產品資訊,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「Sharing (Analytics Hub)」(共用 (Analytics Hub)) 頁面。

    前往「共用 (Analytics Hub)」

  2. 按一下要建立查詢範本的資料無塵室顯示名稱。

  3. 按一下「Add data」(新增資料),然後按照步驟建立已設定分析規則的檢視表。如需詳細操作說明,請參閱「建立產品資訊 (新增資料)」。

    如要新增其他方的資料,請與其他信任的貢獻者共用資料無塵室。此外,資料提供者也必須將資料新增至資料無塵室,才能在查詢範本中使用。

  4. 設定清單的資料輸出控制項。

  5. 設定產品資訊的中繼資料控制項。如果只想分享上一步新增資料的結構定義和說明 (而非共用資料本身),請選取「Exclude access to listing from linked dataset」(排除連結資料集的清單存取權)。

  6. 查看商店資訊詳細資料。

  7. 按一下「新增資料」。資料無塵室現在包含您為資料建立的檢視表中繼資料。

將現有 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/routines/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:產品資訊顯示名稱。

建立查詢範本

如要建立查詢範本,請選取下列其中一個選項:

控制台

  1. 前往 Google Cloud 控制台的「Sharing (Analytics Hub)」(共用 (Analytics Hub)) 頁面。

    前往「共用 (Analytics Hub)」

  2. 按一下要建立查詢範本的資料無塵室顯示名稱。

  3. 在資料無塵室中,前往「範本」分頁。

  4. 按一下「建立範本」。

  5. 輸入範本顯示名稱和說明。

  6. 點選「下一步」。

  7. 使用新增至資料無塵室的檢視表結構定義,提出查詢定義:

    • 使用支援的 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。

  8. 查看範本詳細資料。

  9. 如要儲存範本,但不送審,請按一下「儲存」。 查詢範本的狀態現在會顯示為「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 \
'{
  "displayName": "DISPLAY_NAME",
  "routine": {
    "routineType": "TABLE_VALUED_FUNCTION",
    "definitionBody": "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)

將 APPROVERS_DATASET 替換為範本核准者建立常式的資料集 ID。

您可以更新查詢範本,或將查詢範本送審。

更新查詢範本

只有在查詢範本處於「草稿」狀態時,才能更新範本。查詢範本送審後即無法修改。

如要更新查詢範本,請選取下列其中一個選項:

控制台

  1. 前往 Google Cloud 控制台的「Sharing (Analytics Hub)」(共用 (Analytics Hub)) 頁面。

    前往「共用 (Analytics Hub)」

  2. 按一下含有查詢範本的資料無塵室顯示名稱。

  3. 在資料無塵室中,前往「範本」分頁。

  4. 在要更新的範本列中,依序按一下 「Actions」(動作) >「Edit template」(編輯範本)。

  5. 視需要更新說明和主要聯絡人。

  6. 點選「下一步」。

  7. 查看範本詳細資料。

  8. 如要儲存範本,但不送審,請按一下「儲存」。

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 '{
   "description": "New query template"
 }'

更改下列內容:

  • DCR_PROJECT_ID:資料無塵室建立所在專案的專案 ID。
  • LOCATION:資料無塵室的位置。
  • CLEAN_ROOM_ID:資料無塵室 ID。
  • QUERY_TEMPLATE_ID:查詢範本 ID。

提交查詢範本以供審查

如要提交查詢範本進行審查,請選取下列其中一個選項:

控制台

  1. 前往 Google Cloud 控制台的「Sharing (Analytics Hub)」(共用 (Analytics Hub)) 頁面。

    前往「共用 (Analytics Hub)」

  2. 按一下含有查詢範本的資料無塵室顯示名稱。

  3. 在資料無塵室中,前往「範本」分頁。

  4. 在要送審的範本資料列中,依序按一下 「Actions」(動作) >「Submit for review」(送審)。範本狀態會變成「Requires 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。

刪除查詢範本

只有在查詢範本處於「草稿」狀態時,才能刪除。查詢範本送審後即無法刪除。

如要刪除查詢範本,請選取下列其中一個選項:

控制台

  1. 前往 Google Cloud 控制台的「Sharing (Analytics Hub)」(共用 (Analytics Hub)) 頁面。

    前往「共用 (Analytics Hub)」

  2. 按一下含有查詢範本的資料無塵室顯示名稱。

  3. 在資料無塵室中,前往「範本」分頁。

  4. 在要刪除的範本資料列中,依序按一下 「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/QUERY_TEMPLATE_ID

更改下列內容:

  • DCR_PROJECT_ID:資料無塵室建立所在專案的專案 ID。
  • LOCATION:資料無塵室的位置。
  • CLEAN_ROOM_ID:資料無塵室 ID。
  • QUERY_TEMPLATE_ID:查詢範本 ID。

範本核准者工作流程

查詢範本核准者可以核准查詢範本。

如果 TVF 參照的資料不屬於您 (例如其他貢獻者的資料),則只有該資料的擁有者可以核准查詢範本。如果您建立的 TVF 只參照您的資料,用於單向共用,則可自行核准查詢範本。

核准查詢範本

如要核准查詢範本,請選取下列其中一個選項:

控制台

  1. 前往 Google Cloud 控制台的「Sharing (Analytics Hub)」(共用 (Analytics Hub)) 頁面。

    前往「共用 (Analytics Hub)」

  2. 按一下含有查詢範本的資料無塵室顯示名稱。

  3. 在資料無塵室中,前往「範本」分頁。

  4. 在需要審查的範本資料列中,依序按一下 「核准狀態」 >「需要審查」。

  5. 按一下「核准」。

  6. 選取範本位置。這個位置是建立 TVF 以供共用的位置。

  7. 查看建議的查詢範本。

  8. 如要核准查詢範本,以便在資料無塵室中使用,請按一下「Approve」(核准)。

API

  1. 呼叫 jobs.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:建立常式的查詢。
  2. 將建立的常式新增至資料無塵室:

    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/routines/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:產品資訊顯示名稱。
  3. 將查詢範本狀態更新為 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,無法存取基礎共用資料。

訂閱查詢範本

如要訂閱查詢範本,請選取下列其中一個選項:

控制台

如要訂閱查詢範本,請訂閱資料無塵室。訂閱後,即可存取所有停用「排除連結資料集中的清單項目存取權」設定的清單項目。

訂閱資料無塵室後,請按照下列步驟執行查詢範本:

  1. 前往 Google Cloud 控制台的「BigQuery」頁面。

    前往「BigQuery」

  2. 在「Explorer」窗格中,前往訂閱資料無塵室時建立的連結資料集。

  3. 開啟連結資料集中共用的常式或資料表值函式。

  4. 按一下「叫用資料表函式」。

  5. 請將參數替換為可接受的輸入內容,也就是資料表名稱或欄位。

  6. 按一下「執行」。

如果無法在「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 資料無塵室查詢範本的定價:

角色 定價詳細資料
資料提供者 僅收取資料儲存費用。
範本訂閱者 執行查詢時,只需支付運算 (分析) 費用。

後續步驟