查詢 Bigtable 資料
本文件說明如何使用 BigQuery 查詢儲存在 Bigtable 外部資料表中的資料。如要瞭解如何直接查詢 Bigtable 中的資料,請參閱 Bigtable 適用的 GoogleSQL 總覽。
Bigtable 是 Google 的稀疏分布型 NoSQL 資料庫,其內容可擴充為數十億個資料列及數千個資料欄,儲存資料量並可達 PB 規模。如要瞭解 Bigtable 資料模型,請參閱「儲存模型」。
查詢永久外部資料表
開始之前,您或貴機構的管理員必須先建立外部資料表,供您使用。如需詳細資訊和所需權限,請參閱「建立 BigQuery 外部資料表」。
必要的角色
如要查詢 Bigtable 外部資料表,請確認您具備下列角色。
- BigQuery 資料檢視者 (
roles/bigquery.dataViewer
) - BigQuery 使用者 (
roles/bigquery.user
) - Bigtable 讀取者 (
roles/bigtable.reader
)
視您的權限而定,您可以授予自己這些角色,或請管理員授予您這些角色。如要進一步瞭解如何授予角色,請參閱「查看可針對資源授予的角色」。
如要查看查詢外部資料表所需的確切 BigQuery 權限,請展開「Required permissions」部分:
所需權限
bigquery.jobs.create
bigquery.readsessions.create
(僅適用於使用 BigQuery Storage Write API 串流資料的情況)bigquery.tables.get
bigquery.tables.getData
查詢資料表
您可以對永久性外部 Bigtable 資料表執行查詢,就像是對標準 BigQuery 資料表執行查詢一樣,但外部資料來源的限制仍適用。如需詳細資訊,請參閱「執行互動式和批次查詢」。
查詢臨時外部資料表
使用臨時資料表查詢外部資料來源,對於一次性、臨時查詢外部資料,或對擷取、轉換和載入 (ETL) 處理程序而言非常有用。
如要查詢外部資料來源,但不想建立永久資料表,請為臨時資料表提供資料表定義,然後在指令或呼叫中使用該資料表定義來查詢臨時資料表。您可以透過下列任一方式提供資料表定義:
- 資料表定義檔
- 內嵌結構定義
- JSON 結構定義檔案
系統會使用資料表定義檔或提供的結構定義來建立臨時外部資料表,然後對臨時外部資料表執行查詢。
使用臨時外部資料表時,並不會在某個 BigQuery 資料集中建立資料表。因為資料表不會永久儲存在資料集中,所以無法與其他使用者分享。
使用臨時外部資料表而非永久外部資料表時,會有一些限制,包括:
- 您必須具備 Bigtable 管理員 (
roles/bigtable.admin
) 角色。 - 這種做法無法讓您使用 Google Cloud 主控台推論 Bigtable 資料表的結構定義,並自動建立資料表定義。您必須自行建立資料表定義。
必要的角色
如要查詢 Bigtable 臨時外部資料表,請確認您具備下列角色:
- BigQuery 資料檢視者 (
roles/bigquery.dataViewer
) - BigQuery 使用者 (
roles/bigquery.user
) - Bigtable 管理員 (
roles/bigtable.admin
)
視您的權限而定,您可以授予自己這些角色,或請管理員授予您這些角色。如要進一步瞭解如何授予角色,請參閱「查看可針對資源授予的角色」。
如要查看查詢外部資料表所需的確切 BigQuery 權限,請展開「Required permissions」部分:
所需權限
bigquery.jobs.create
bigquery.readsessions.create
(僅適用於使用 BigQuery Storage Write API 串流資料的情況)bigquery.tables.get
bigquery.tables.getData
建立及查詢資料表
如要使用臨時外部資料表查詢 Bigtable 資料,您需要:
- 建立資料表定義檔
- 同時提交查詢與資料表定義檔
bq 指令列工具和 API 支援建立及查詢臨時外部資料表。
bq
如要使用資料表定義檔查詢臨時資料表,請輸入 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
Java
在嘗試這個範例之前,請先按照 BigQuery 快速入門:使用用戶端程式庫中的 Java 設定說明進行操作。詳情請參閱 BigQuery Java API 參考說明文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
效能注意事項
針對 Bigtable 外部資料來源執行查詢的效能取決於三個因素:
- 列數
- 讀取資料量
- 平行處理範圍
為了盡可能減少讀取的資料量,BigQuery 僅會讀取查詢中參照的資料欄系列。平行處理範圍取決於 Bigtable 叢集中的節點數以及資料表的分割數。
請注意,Bigtable 會根據負載自動合併分割。如果您的資料表較少被讀取,一段時間後分割數就會變少,查詢效能也會逐漸降低。詳情請參閱「BigQuery 如何隨著時間的推移來最佳化您的資料」。
運算
從 BigQuery 查詢 Bigtable 資料時,您可以使用下列運算選項:
- 叢集節點 (預設)。
- Data Boost (預先發布版):無伺服器運算選項,可讓您區隔資料分析流量,不會影響叢集節點處理的應用程式服務流量。
如要使用 Data Boost,您或管理員必須建立定義檔,在 Bigtable URI 中指定 Data Boost 應用程式設定檔。詳情請參閱「建立 Bigtable 外部資料表」。
如果您未使用 Data Boost,請注意,從 BigQuery 查詢 Bigtable 會耗用 Bigtable CPU 週期。當 BigQuery 使用已佈建的節點進行運算時,CPU 使用量可能會影響其他並行要求 (例如即時使用者流量處理) 的延遲時間與總處理量。舉例來說,Bigtable 上的高 CPU 使用量會影響長尾查詢,並提高第 99 個百分位數的延遲。
因此,您應監控 Bigtable CPU 使用量,以確認您仍在 Google Cloud 主控台 Bigtable 監控資訊主頁所示的建議範圍內。增加執行個體的節點數能讓您同時處理 BigQuery 流量與其他並行要求流量。
查詢篩選器
具有列等號篩選器的查詢僅會讀取該列。例如,在 GoogleSQL 語法中:
SELECT COUNT(follows.column.name) FROM `dataset.table` WHERE rowkey = "alice";
另外也支援 rowkey > '1'
和 rowkey < '8'
等範圍篩選器,但前提是您必須使用 readRowkeyAsString
選項,把 rowkey 當做字串讀取。