查詢 Cloud Bigtable 資料

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

Cloud Bigtable 是 Google 的稀疏分布型 NoSQL 資料庫,其內容可擴充為數十億個資料列及數千個資料欄,儲存資料量並可達 PB 規模。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

存取權控管和範圍

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

與 Cloud Bigtable 資料來源連結的永久外部資料表,是您可以分享存取權的項目。而臨時外部資料表,就不是您可以分享的存取權物件。

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

  • 資料集層級以上的 bigquery.dataViewer 角色,以存取外部資料表所屬的資料集
  • 專案層級以上的 bigquery.user 角色,以執行查詢工作
  • Cloud Bigtable 中的 bigtable.reader 角色,以提供對中繼資料和資料表的唯讀存取權

Compute Engine 執行個體的範圍

建立 Compute Engine 執行個體時,您可以為該執行個體指定範圍清單。這些範圍控制執行個體對 Google Cloud 產品的存取權,其中也包含是否能使用 Cloud Bigtable。在 VM 上執行的應用程式會使用服務帳戶呼叫 Google Cloud API。

如果將 Compute Engine 執行個體設為以服務帳戶形式執行,且該服務帳戶會存取連結至 Cloud Bigtable 資料來源的外部資料表,您就必須將 Cloud Bigtable 唯讀資料存取權範圍 (https://www.googleapis.com/auth/bigtable.data.readonly) 新增至執行個體。如要進一步瞭解,請參閱為 Cloud Bigtable 建立 Compute Engine 執行個體的相關說明。

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

永久與臨時外部資料表的比較

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

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

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

如要使用永久資料表查詢 Cloud Bigtable 資料來源,您可在 BigQuery 資料集中建立連結至 Cloud Bigtable 資料來源的資料表。資料不會儲存在 BigQuery 資料表中。由於資料表為永久性,因此您可以使用資料集層級存取權控管設定,將資料表分享給也能存取原始 Cloud Bigtable 資料來源的其他使用者。

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

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

如要使用永久外部資料表查詢 Cloud Bigtable 資料,您需要:

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

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

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

主控台

目前無法使用 Cloud Console 查詢 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 資料表一樣執行查詢。查詢完成後,可以將結果匯出為 CSV 或 JSON 檔案、將結果儲存為資料表,或將結果儲存至 Google 試算表。

CLI

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

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

    bq mk \
    --external_table_definition=definition_file \
    dataset.table
    

    其中:

    • definition_file 是本機機器上資料表定義檔的路徑。
    • dataset 是要包含該資料表之資料集的名稱。
    • table 是您正要建立之資料表的名稱。

    接著,您就可以對資料表執行查詢,就像是原生 BigQuery 資料表一樣,但外部資料來源的限制仍適用。

API

  • 針對資料表資源中的 sourceUris 屬性,您只能夠指定一個 Cloud Bigtable URI,且該 URI 必須是完整有效的 HTTPS 網址。

  • 設定 sourceFormat 屬性,藉此指定資料格式屬性。由於使用的是 Cloud Bigtable,因此請指定 "BIGTABLE"

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

如要查詢外部資料來源,但不想建立永久資料表,請執行指令來合併以下項目:

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

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

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

如要使用臨時外部資料表查詢 Cloud Bigtable 資料,您需要:

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

CLI

如要使用資料表定義檔查詢臨時資料表,請輸入 bq query 指令並加上 --external_table_definition 旗標。

(選擇性操作) 提供 --location 旗標,並將值設為您的位置

bq --location=location query \
--use_legacy_sql=false \
--external_table_definition=table::definition_file \
'query'

其中:

  • location 是您位置的名稱。--location 旗標可選擇性使用。
  • table 是您正要建立的臨時資料表名稱。
  • definition_file 是本機機器上資料表定義檔的路徑。
  • query 是要提交到臨時資料表的查詢。

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

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

API

  • 建立查詢。如要瞭解如何建立查詢工作,請參閱查詢資料的相關說明。

  • (選擇性操作) 在工作資源jobReference 區段中,於 location 屬性內指定您的位置。

  • 設定資料表資源ExternalDataConfiguration,藉此指定外部資料來源屬性。

效能注意事項

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

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

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

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

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

您應監控 Cloud Bigtable 的 CPU 使用量,以確認您仍在建議範圍內。建議範圍如 Cloud Console 的 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`
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`
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`
WHERE
  rowkey = "alice";

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