---
# System prepended metadata

title: "《Bigtable 實戰手冊：從設計到部署的完整指南\U0001F4D2\U0001F4D9\U0001F4D8》"

---

# 《Bigtable 實戰手冊：從設計到部署的完整指南📒📙📘》
![image](https://hackmd.io/_uploads/HyACaMBSxx.png)

## 📒 摘要
本文會詳細說明 Bigtable 如何透過分散式架構來處理大量資料，教你設計資料表和 Row Key 的技巧，提供查詢效能優化的建議，並示範實際的 CLI 操作範例。讀完這份指南後，希望能幫助你學會：

* 如何根據你的應用需求設計高效能的 Bigtable Schema（資料結構）
* 如何使用 cbt 工具進行資料查詢與管理
* 在大規模 IoT 數據、用戶行為分析等場景下，如何發揮 Bigtable 的高擴展性與效能優勢

參考連結：[Google Cloud Skills Boost](https://www.cloudskillsboost.google/focuses/92496?catalog_rank=%7B%22rank%22%3A1%2C%22num_filters%22%3A0%2C%22has_search%22%3Atrue%7D&parent=catalog&search_id=47567047)

![image](https://hackmd.io/_uploads/H1Sg9MBSxe.png)
**source: https://cloud.google.com/bigtable?hl=zh_tw**
## 📒 什麼是 Bigtable
Cloud Bigtable 是 Google Cloud 提供的分散式、可擴展且高效能的 NoSQL 資料庫服務，適合儲存與處理大量非結構化或串流資料。它能根據 Cluster 和 Node 數量動態調整查詢與寫入效能，常見應用包括 IoT 時間序列資料收集、即時用戶行為追蹤、金融交易紀錄、搜尋索引與預測性維護分析等。
### 📙 適用場景：
- 超大規模時間序列資料（如智慧電表、感測器）
- 分析型工作負載（如推薦系統、用戶行為分析）
### 📙 架構重點：
- 可建立多個 Instance，每個 Instance 下可有多個 Cluster 與 Node，靈活擴充計算與儲存資源。
- Instance：Bigtable 的服務單位，可包含多個 Cluster。
- Cluster：一組可橫向擴充的計算與儲存節點，影響效能與可用性。
- Node：執行實際讀寫作業的節點，增加節點數可提升效能。
- 一個服務可建立多個 Instance，每個 Instance 可包含多個 Cluster 與 Node。
- ![Instance 架構圖](https://hackmd.io/_uploads/S1CCfikHee.png)
- Cluster 配置：  
    ![Cluster 圖](https://hackmd.io/_uploads/SJxbG4sJrgx.png)
    
### 📙 利用UI操作
可以點選服務儀錶板左側的"big table studio", 會出現可以操作的介面並利用SQL query去搜非結構化資料，邏輯跟使用規則有點像amazon redshift
![image](https://hackmd.io/_uploads/HJG5JhyBel.png)

### 📙 Bigtable 的 Query 結構配置
![Bigtable 結構圖](https://hackmd.io/_uploads/SJW6Z3Jrgl.png)
* **Tables（表格）** ：類似 Excel 表格，是 Bigtable 中存放資料的容器。
* **Column Families（欄位家族）**：將相關資料欄位歸類在一起，方便管理與節省空間。例如：`UserSessions`、`dgda`。
* **Views（檢視）**：可用不同角度查看同一份資料，不會額外佔用儲存空間。
* **Materialized Views（實體化檢視）**：預先計算並儲存常用查詢結果，查詢時可直接取得，提升效率。
* **Authorized Views（授權檢視）**：設定不同權限，讓不同使用者僅能存取被授權的資料範圍。


    
    
## 📒 非結構化資料結構解析
![image](https://hackmd.io/_uploads/rJ56r3JSgl.png)
Bigtable 通常將資料存入特定 Table，並透過 Row Key 優化查詢與寫入效率。例如：
- **Row Key**: Bigtable 用來唯一識別並排序每筆資料列的鍵，決定資料儲存與查詢效率的關鍵欄位。(範例："user0#1638940844350")
    - **user0**：用戶或裝置識別碼
    - **1638940844350**：時間戳，記錄資料產生時間
對應的 Column Family 可儲存如下資料：
```json
{
  "blue_hat": "viewed details",
  "green_jacket": "seen",
  "purple_dress": "seen",
  "purple_jacket": ""
}
```
這代表使用者 user0 在特定時間點：
- 瀏覽了藍色帽子（viewed details）
- 看過綠色夾克與紫色洋裝（seen）
- 查閱紫色夾克但尚未有動作（空值）

透過這種結構設計，Bigtable 能高效記錄與查詢大規模 IoT 或用戶行為資料，並藉由良好的 Row Key 與 Column Family 規劃，確保查詢效能與資料彈性儲存。


#### Bigtable 最有效率的查詢方式如下：
- 直接以 row key 查詢
- 以 row key 前綴查詢
- 以起始與結束 row key 定義的範圍查詢


## 📒 Bigtable 特色與查詢建議
### 📙 資料分類整理
* 將相同類型的資料放在同一個 column family，並取簡短有意義的名稱。
### 📙 善用欄位名稱
* 將欄位名稱作為資料內容，避免每列重複存相同值，節省儲存空間。
### 📙 完整性原則
* 將同一事件（如一次購物的所有資訊）存於同一 row，確保資料完整。
### 📙 設計好用的 Row Key
- 根據查詢需求設計 row key，方便範圍查詢。
- 避免以時間戳或連續編號作為 row key 開頭，以防資料分布不均。
- 建議以共通值（如國家）開頭，細部值（如城市）結尾，例如：`台灣_台北`。
### 📙 Row Key 組合技巧
可用易懂的字串（如「使用者ID_時間戳」）組合 row key，便於管理與查詢。

## 📒 配置 Bigtable CLI 

要使用 `cbt` CLI 連接 Bigtable，首先需要在 Cloud Shell 中更新 `.cbtrc` 配置檔案，並設定你的專案 ID 和 Bigtable 實例 ID。

> * `cbt` CLI 是一個用於管理與操作 Bigtable 的命令列工具。你可以透過它在終端機直接建立表格、插入或查詢資料、管理 row key 及檢查表格狀態。

> * `.cbtrc` 檔案是 `cbt` CLI 的設定檔。它儲存預設的專案 ID、實例 ID 及 Google Cloud 認證位置，讓你在執行 `cbt` 指令時無需重複輸入這些參數。


### - 1. 設定專案 ID
在 Cloud Shell 中執行以下命令，將專案 ID 寫入 `.cbtrc` 檔案：
```bash
echo project = $(gcloud config get-value project) >> ~/.cbtrc
```
### - 2. 查看 Bigtable 實例
使用以下命令查看專案中的所有 Bigtable 實例，確認你的實例名稱（例如：`personalized-sales`）：
```bash
cbt listinstances
```
### - 3. 設定實例 ID
將實例 ID 寫入 `.cbtrc` 檔案：
```bash
echo instance = personalized-sales >> ~/.cbtrc
```
### - 4. 確認設定
使用以下命令確認 `.cbtrc` 檔案的內容：
```bash!
cat ~/.cbtrc
```
應顯示如下內容：
```ini
project = <project-id>
instance = personalized-sales
```
### - 5. 查看表格列表
使用以下命令查看實例中的所有表格：
```bash
cbt ls
```
此例中，應顯示有一個表格 `UserSessions`。
此配置步驟完成後，你可以開始使用 `cbt` 進行 Bigtable 的基本操作。雖然 `cbt` 主要用於調試和探索，對於生產環境的 CRUD 操作，建議使用 Bigtable 客戶端庫。


## 📒 使用 CLI 操作 Bigtable

以下說明指令用途與執行結果：

```shell
student_01_dcf201d51bb2@cloudshell:~ (qwiklabs-gcp-00-19c57ef10bb9)$ cbt set test-sessions green1939#1638940844260 Interactions:red_hat=seen
2025/06/30 06:09:30 -creds flag unset, will use gcloud credential
student_01_dcf201d51bb2@cloudshell:~ (qwiklabs-gcp-00-19c57ef10bb9)$ cbt set test-sessions blue2737#1638940844260 Sales:sale=blue_dress#blue_jacket
2025/06/30 06:09:37 -creds flag unset, will use gcloud credential
student_01_dcf201d51bb2@cloudshell:~ (qwiklabs-gcp-00-
```

- `cbt set` 用於在 `test-sessions` 表中新增或更新資料。例如，將 `green1939#1638940844260` 這筆資料的 `Interactions:red_hat` 欄位設為 `seen`。

```shell
19c57ef10bb9)$ cbt read test-sessions
2025/06/30 06:09:42 -creds flag unset, will use gcloud credential
----------------------------------------
blue2737#1638940844260
    Sales:sale                               @ 2025/06/30-06:09:37.958000
        "blue_dress#blue_jacket"

----------------------------------------
green1939#1638940844260
    Interactions:red_hat                     @ 2025/06/30-06:09:31.301000
        "seen"
```
- `cbt read` 會讀取並顯示表內所有資料，結果如上所示。

若使用以下指令，可以查詢 `UserSessions` 表的前 5 筆資料，並看到類似下圖的資料結構：

```shell
cbt read UserSessions count=5
```
![image](https://hackmd.io/_uploads/HJdMis1Hxg.png)

此外，也可以用 `cbt lookup` 直接查詢指定 row key 的資料：

```shell
cbt lookup UserSessions yellow582#1638940844260
```

查詢結果範例如下：

```shell
----------------------------------------------
yellow582#1638940844260
 Interactions:blue_jacket       @ 2022/06/08-19:47:33.864000
        "seen"
 Sales:sale                     @ 2022/06/08-19:47:33.864000
        "yellow_skirt"
```

這些 CLI 指令可協助你快速存取與查詢 Bigtable 資料。

## 📒 總結摘要
本文詳細說明了 Bigtable 如何透過分散式架構來處理大量資料，教你設計資料表和 Row Key 的技巧，提供查詢效能優化的建議，並示範實際的 CLI 操作範例。
讀完這份文章希望你已經知道了：

1. 如何根據你的應用需求設計高效能的 Bigtable Schema（資料結構）
2. 如何使用 cbt 工具進行資料查詢與管理
3. 在大規模 IoT 數據、用戶行為分析等場景下，如何發揮 Bigtable 的高擴展性與效能優勢








