查詢 Cloud BigTable 資料

本頁面說明如何使用 BigQuery 查詢儲存在 Cloud Bigtable 中的資料。

Cloud Bigtable 是 Google 資料分布稀疏的 NoSQL 資料庫,其內容可擴充為數十億個資料列或數千個資料欄,儲存資料量可達千兆位元組。Cloud Bigtable 的資料模型與 Apache HBase 類似,且提供與 HBase 相容的用戶端程式庫。如需 Cloud Bigtable 資料模型的相關資訊,請參閱儲存模型

支援的地區與區域

目前僅有下列地區與區域提供在 Cloud Bigtable 中查詢資料的服務:
地區 區域
us-central1

us-central1-a

us-central1-b

us-central1-c

us-central1-f

europe-west1

europe-west1-b

europe-west1-c

europe-west1-d

擷取 Cloud Bigtable URI

若要建立 Cloud Bigtable 資料來源的外部資料表,您必須提供 Cloud Bigtable URI。若要擷取 Cloud Bigtable URI:

  1. 開啟 Cloud Bigtable 主控台。

    開啟 Cloud Bigtable 主控台

  2. 擷取 Cloud Bigtable 資料來源的以下詳細資訊:

    • 您的專案 ID
    • 您的 Cloud Bigtable 執行個體 ID
    • 您的 Cloud Bigtable 資料表名稱
  3. 以下列格式撰寫 Cloud Bigtable URI,其中:

    • [PROJECT_ID] 是包含您的 Cloud Bigtable 執行個體的專案
    • [INSTANCE_ID] 是 Cloud Bigtable 執行個體 ID
    • [TABLE_NAME] 是您要查詢的資料表名稱

    https://googleapis.com/bigtable/projects/[PROJECT_ID]/instances/[INSTANCE_ID]/tables/[TABLE_NAME]

存取權控管和範圍

永久外部資料表的存取權控管

您可以分享連結至 Google Cloud Bigtable 資料來源之永久外部資料表的存取權。臨時外部資料表的存取權則無法分享。

您可以跟使用者 (包括服務帳戶) 或群組分享永久外部資料表的存取權。如要查詢外部資料表,您的使用者或群組 (至少) 需要擁有:

Compute Engine 執行個體的範圍

建立 Compute Engine 執行個體時,可以指定執行個體的範圍清單。這些範圍可限制執行個體對 Google Cloud Platform 產品的存取權,包括 Cloud Bigtable。在 VM 上執行的應用程式會使用服務帳戶呼叫 Google Cloud APIs。

如果將 Compute Engine 執行個體設為以服務帳戶執行,且該服務帳戶會存取連結至 Cloud BigTable 資料來源的外部資料表,則您必須為該執行個體加上 Cloud BigTable 唯讀資料存取範圍 (https://www.googleapis.com/auth/bigtable.data.readonly)。如需詳細資訊,請參閱建立 Cloud Bigtable 的 Compute Engine 執行個體

如需為 Compute Engine 執行個體套用範圍的相關資訊,請參閱變更執行個體的服務帳戶與存取範圍。如要深入瞭解 Compute Engine 服務帳戶,請參閱服務帳戶一文。

永久與臨時外部資料表

您可以在 BigQuery 中使用永久資料表或臨時資料表查詢外部資料來源。使用永久資料表時,請在 BigQuery 資料集中建立連結至外部資料來源的資料表。因為是永久資料表,所以您可以使用資料集層級存取權控管,將資料表分享給也具有基礎外部資料來源存取權的其他使用者,而且您可以隨時查詢此資料表。

使用臨時資料表查詢外部資料來源時,您必須提交內含查詢的指令,並建立連結至外部資料來源的非永久資料表。使用臨時資料表時,不用在 BigQuery 資料集內建立資料表。因為資料表不會永久儲存在資料集中,所以無法與其他使用者分享。使用臨時資料表查詢外部資料來源,對於一次性、臨時查詢外部資料,或對擷取、轉換和載入 (ETL) 處理程序而言非常有用。

使用永久外部資料表查詢 Cloud BigTable 資料

若要使用永久資料表查詢 Cloud Bigtable 資料來源,可在 BigQuery 資料集中建立連結至 Cloud Bigtable 資料來源的資料表。資料不會儲存在 BigQuery 表格中。因為資料表是永久的,所以您可使用資料集層級存取權控管,將資料表分享給也能存取基礎 Cloud Bigtable 資料來源的其他使用者。

在 BigQuery 中建立連結至 Cloud Bigtable 資料來源的永久外部資料表時,有兩種方法可指定資料表的結構定義:

  • 如果您使用 API 或 CLI,請建立資料表定義檔案,以定義外部資料來源的結構定義與中繼資料。
  • 如果您使用 GCP 主控台或 BigQuery 傳統網頁版 UI,請手動輸入 Cloud Bigtable 資料欄系列與限定詞。

若要使用永久外部資料表查詢 Cloud Bigtable 資料,您必須:

  • 建立資料表定義檔案 (針對 CLI 或 API)
  • 在 BigQuery 中建立連結至外部資料來源的資料表
  • 使用永久資料表查詢資料

建立並查詢永久外部資料表

如何建立並查詢永久資料表:

主控台

目前無法使用 GCP 主控台從 Cloud Bigtable 查詢資料。

傳統版 UI

  1. 前往 BigQuery 網頁版 UI。
    前往 BigQuery 網頁版 UI

  2. 在導覽面板中,將滑鼠游標懸停在資料集上,然後按一下向下箭號圖示 向下箭號圖示圖片,再按一下 [Create new table]

  3. 在「Create Table」頁面的「Source Data」區段中:

    • 在「Location」中,選取 [Google Cloud Bigtable],並在來源欄位中,依照下列格式輸入 Cloud BigTable URI:https://googleapis.com/bigtable/projects/[PROJECT_ID]/instances/[INSTANCE_ID]/tables/[TABLE_NAME]。其中,[PROJECT_ID] 是包含您的 Cloud Bigtable 執行個體的專案,[INSTANCE_ID] 是 Cloud Bigtable 執行個體 ID,而 [TABLE_NAME] 是您正在查詢的資料表名稱。
    • 在「File format」(檔案格式) 中,確認已選取 [Cloud Bigtable]。
  4. 在「Create Table」(建立資料表) 頁面的「Destination Table」(目標資料表) 部分中:

    • 針對「Table name」(資料表名稱) 選擇適當的資料集,然後在資料表名稱欄位中,輸入要在 BigQuery 中建立的永久資料表名稱。
    • 確認「Table type」(資料表類型) 已設為 [External table] (外部資料表)。
  5. 在「Column Family and Qualifiers」方塊中,使用「Add Family」 指定資料欄系列與限定詞,或按一下 [Edit as text] 並輸入資料欄系列與限定詞的 JSON 陣列。這份清單會限制查詢中可參照的資料欄系列並指定其值類型。例如:

      [
        {
          "familyId": "family_int",
          "type": "INTEGER",
          "encoding": "BINARY",
          "onlyReadLatest": "true",
          "columns": [
            {
              "qualifierString": "foo",
              "onlyReadLatest": "true"
            }
          ]
        }
      ]
    
    您可以利用資料欄限定詞清單來執行類型轉換。如果您將清單保持空白,則資料表結構定義中會包含所有資料欄系列,且所有資料欄系列的值會顯示為 BYTES。如需詳細資訊,請參閱 externalDataConfiguration API 說明文件中的 Cloud BigTable 選項。

  6. 在「Options」(選項) 區段中選取適用的項目,然後按一下 [Create Table] (建立資料表)

永久資料表建立完成後,您就可以在外部資料來源的限制下,把資料表當做原生 BigQuery 表格一樣進行查詢。若要在網路 UI 中查詢資料表,請按一下 [Compose Query],在 [New Query] 方塊中輸入您的查詢,然後按一下 [Run Query]

查詢完成後,可以將結果匯出為 CSV 或 JSON 檔案,將結果儲存為資料表,或將結果儲存至 Google 試算表。詳情請參閱下載、儲存及匯出資料一文。

CLI

您可以在 BigQuery 指令列工具中使用 bq mk 指令建立資料表。使用 CLI 建立連結至外部資料來源的資料表時,您可以使用資料表定義檔識別資料表的結構定義:

  1. 使用 bq mk 指令建立永久資料表。

    bq mk --external_table_definition=[DEFINITION_FILE] [DATASET].[TABLE_NAME]
    

    其中:

    • [DEFINITION_FILE] 是本機電腦上的資料表定義檔路徑
    • [DATASET] 是包含該資料表的資料集名稱
    • [TABLE_NAME] 是您要建立的資料表名稱

    接著,您就可以在外部資料來源的限制下,將資料表當做原生 BigQuery 表格執行查詢。

API

使用臨時外部資料表查詢 Cloud Bigtable 資料

若要查詢外部資料來源而不建立永久資料表,請執行指令以合併:

系統會使用資料表定義檔或提供的結構定義來建立臨時外部資料表,然後對臨時外部資料表執行查詢。BigQuery CLI 及 API 支援使用臨時資料表查詢外部資料來源。

使用臨時外部資料表時,並不會在其中一個 BigQuery 資料集中建立資料表。因為資料表不會永久儲存在資料集中,所以無法與其他使用者分享。使用臨時資料表查詢外部資料來源,對於臨時的一次性外部資料查詢作業,或對擷取、轉換和載入 (ETL) 程序而言非常有用。

建立並查詢臨時外部資料表

若要使用臨時外部資料表查詢 Cloud Bigtable 資料,您必須:

CLI 和 API 目前支援建立和查詢臨時外部資料表。

CLI

若要使用資料表定義檔查詢臨時資料表,請輸入下列指令。

bq --location=[LOCATION] query --use_legacy_sql=false --external_table_definition=[TABLE_NAME]::[DEFINITION_FILE] '[QUERY]'

其中:

  • [LOCATION] 是您的位置名稱。如果您的資料位於 --locationUS 多地區位置,則 EU 標記為選用。
  • [TABLE_NAME] 是要建立的臨時資料表名稱。
  • [DEFINITION_FILE] 是本機電腦上資料表定義檔的路徑。
  • [QUERY] 是要提交至臨時資料表的查詢。

舉例來說,下列指令會使用名為 follows_def 的資料表定義檔建立並查詢名為 follows 的臨時資料表。

bq --location=US query --use_legacy_sql=false --external_table_definition=follows::/tmp/follows_def 'SELECT COUNT(rowkey) FROM follows;'

API

效能注意事項

Cloud Bigtable 外部資料來源的查詢效能取決於三項因素:

  • 列數
  • 讀取資料量
  • 平行處理範圍

為了盡可能減少讀取的資料量,BigQuery 僅會讀取查詢中參照的資料欄系列。平行處理範圍取決於 Cloud Bigtable 叢集中的節點數以及資料表的分割數。

請注意,Cloud Bigtable 會根據負載自動合併分割。如果您的資料表較少被讀取,一段時間後分割數就會變少,查詢效能也會逐漸降低。若要進一步瞭解如何以資料列索引鍵分割資料表,請參閱管理資料表

從 BigQuery 查詢 Cloud Bigtable 會耗用 Cloud Bigtable CPU 週期。BigQuery 耗用 CPU 可能會影響其他並行要求 (例如即時使用者流量處理) 的延遲時間與總處理量。舉例來說,Cloud Bigtable 上的高 CPU 使用量可能會影響長尾查詢並提高延遲至第 99 個百分位數。

您應監控 Cloud Bigtable CPU 使用量以確認您仍在 GCP 主控台 Cloud Bigtable 監控資訊主頁所示的建議範圍內。增加執行個體的節點數能讓您更有效率地處理 BigQuery 流量與其他並行要求流量。

產生的結構定義

根據預設,BigQuery 會將資料欄系列中的值以資料欄陣列的形式呈現,並在其中提供在不同時間戳記寫入的值陣列。這個結構定義會在 Cloud Bigtable 中保留資料的原始配置,但執行 SQL 查詢可能會有困難。您可以將資料欄升級至父資料欄系列中的子欄位,僅讀取各儲存格最新的值。這會將預設結構定義中的兩個陣列以星狀值的方式呈現。

範例

您要儲存虛擬社群網路的使用者個人資料。其資料模型可能會是 profile 資料欄系列加上 genderageemail 的個別資料欄:

rowkey | profile:gender| profile:age| profile:email
-------| --------------| -----------| -------------
alice  | female        | 30         | alice@gmail.com

在使用預設結構定義的前提下,計算超過 30 歲的男性使用者人數的標準 SQL 查詢如下:

SELECT COUNT(1) FROM `[DATASET].[TABLE_NAME]`
OMIT RECORD IF NOT SOME(profile.column.name = "gender" AND profile.column.cell.value = "male")
OR NOT SOME(profile.column.name = "age" AND INTEGER(profile.column.cell.value) > 30);

如果 genderage 以子欄位的形式呈現,要查詢資料就相對簡單許多。若要以子欄位的形式呈現,請在定義資料表時將 genderage 列為 profile 資料欄系列中的已命名資料欄。您也可以指示 BigQuery 顯示自這個資料欄系列開始以來的最新值。一般來說,僅有最新的值 (而且可能也是唯一值) 需要注意。

將資料欄以子欄位的形式呈現時,計算超過 30 歲之男性使用者人數的標準 SQL 查詢如下:

SELECT COUNT(1) FROM `[DATASET].[TABLE_NAME]`
WHERE profile.gender.cell.value="male" AND profile.age.cell.value > 30;

請注意 genderage 是如何被參照為欄位。此設定的 JSON 配置如下:

      "bigtableOptions": {
        "readRowkeyAsString": "true",
        "columnFamilies": [
          {
              "familyId": "profile",
              "onlyReadLatest": "true",
              "columns": [
                  {
                      "qualifierString": "gender",
                      "type": "STRING"
                  },
                  {
                      "qualifierString": "age",
                      "type": "INTEGER"
                  }
              ]
          }
        ]
      }
    

值編碼

Cloud Bigtable 會將資料儲存為原始位元組而不採用資料編碼。然而,位元組值在 SQL 查詢分析中的用途有限。Cloud Bigtable 提供兩種基本類型的純量解碼:文字和 HBase 二進位檔。

文字格式假定所有的值都會儲存為英數文字字串。 例如,整數 768 會儲存為字串 "768"。二進位檔編碼假定之前採用的 HBase Bytes.toBytes 方法類別是用來編碼資料,並套用適當的解碼方法。

查詢篩選器

具有列等號篩選器的查詢僅會讀取該列。例如,在標準 SQL 語法中:

SELECT COUNT(follows.column.name) FROM `[DATASET].[TABLE_NAME]` WHERE rowkey = "alice";

另外也支援 rowkey > '1'rowkey < '8' 等範圍篩選器,但前提是您必須使用 readRowkeyAsString 選項,把 rowkey 當做字串讀取。

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁