本文件提供整合 Google Earth Engine (EE) 與 BigQuery (BQ) 的操作指南,協助您進行高效率的地理空間分析。這份文件涵蓋兩個平台之間的資料移轉、效能考量、限制和成本影響。
什麼是 BigQuery?
BigQuery 是 Google 的全代管無伺服器資料倉儲,可對 PB 級資料進行可擴充的分析。它擅長執行高速 SQL 查詢,並支援地理空間資料。
什麼時候該使用 BigQuery 或 Earth Engine?
| BigQuery | Earth Engine | |
|---|---|---|
| 資料類型 | 主要為結構化、分析向量資料。支援對 GEOGRAPHY 資料執行地理空間運算。 |
主要為光柵資料,但也支援向量資料。 |
| 處理中 | 以 SQL 為基礎的查詢,經過最佳化調整,適用於大規模匯總和彙整。與 BQ Machine Learning 深度整合。 | 用於處理和分析影像的 JavaScript 和 Python API,包括進階地理空間演算法和機器學習。 |
| 擴充 | PB 等級的儲存空間和分析功能。著重於表格資料處理。 | PB 等級的儲存空間和分析功能。著重於地理空間分析,但向量資料處理規模有限。 |
| 用途 | 資料倉儲、商業智慧、大型向量資料集的地理空間分析。 | 地理空間分析、遙測、環境監控、以光柵資料為基礎的機器學習。 |
向量和光柵資料
向量資料是地球表面上的點、線和多邊形。在 BigQuery 中,向量資料會使用 GEOGRAPHY 資料類型儲存;在 Earth Engine 中,這些是 ee.Geometry 物件。
光柵資料是投影的像素格線。Earth Engine 經過最佳化調整,可處理及處理大型光柵資料集。
同時使用這兩種系統的好處
BigQuery 具備的擴充性,可讓您處理大量表格資料集,而這類資料集在 Earth Engine 中處理起來可能會很困難。此外,Earth Engine 可支援 BigQuery 無法處理的大規模強化和向量至光柵處理作業。
Earth Engine 支援的地理空間函式和資料範圍比 BigQuery 更廣泛,但 BigQuery 與其他工具和服務的整合功能更為豐富。
將 Earth Engine 資料移至 BigQuery
Earth Engine 可將資料直接匯出至 BigQuery,以便進一步分析及整合其他資料集。
Export.table.toBigQuery()
使用 Export.table.toBigQuery() 函式觸發非同步匯出工作,將 Earth Engine 運算結果寫入 BigQuery。您可以透過 Cloud 控制台的工作檢視畫面或 Earth Engine 程式碼編輯器查看及控制這些 Earth Engine 工作。
JavaScript
// Define an Earth Engine feature collection. var features = ee.FeatureCollection('USDOS/LSIB_SIMPLE/2017'); // Export the feature collection to BigQuery. Export.table.toBigQuery({ collection: features, description: 'export_to_bigquery', table: 'my_project.my_dataset.my_table', append: true, overwrite: false });
Python
# Define an Earth Engine feature collection. features = ee.FeatureCollection('USDOS/LSIB_SIMPLE/2017') # Export the feature collection to BigQuery. task = ee.batch.Export.table.toBigQuery( collection=features, description='export_to_bigquery', table='my_project.my_dataset.my_table', append=True, overwrite=False ) task.start()
詳情請參閱完整函式說明文件。
同步 API
Earth Engine 中沒有直接的連接器,無法同步將資料直接寫入 BigQuery。您可以使用偏好的語言 (Python、Java、Go 等) 的 BigQuery 用戶端程式庫,將資料串流至 BigQuery,也可以使用 RPC Storage API 進行即時或近乎即時的資料移轉。
| 主題 | 詳細資料 |
|---|---|
| 先決條件 | 專案必須已啟用 BigQuery API 和 BigQuery Storage API。 |
| 權限 | 您必須具備目標 BigQuery 資料集的寫入權限,以及在目標專案中建立工作內容的權限。如需詳細資訊,請參閱必要權限清單。如要進一步瞭解如何管理權限,請參閱 BigQuery 存取權控管說明文件。 |
| 定價 | 您會因使用 BigQuery 而產生費用,包括儲存和分析您匯出至 BigQuery 的任何 Earth Engine 資料。詳情請參閱 Earth Engine 至 BigQuery 匯出定價。 |
| 限制 | 產生的資料必須符合 BigQuery 的資料表模型,且每列的大小不得超過 8 MB。如要匯出 Earth Engine 資料至 BigQuery,請參閱已知問題。 |
直接從 BigQuery 載入資料
ee.FeatureCollection.loadBigQueryTable() 函式會直接從 BigQuery 資料表載入資料,不必在 BigQuery 中轉換資料。
JavaScript
// Load the BigQuery table with a specified geometry column. var features = ee.FeatureCollection.loadBigQueryTable({ tablePath: 'my_project.my_dataset.my_table', geometryColumn: 'geo' }); // Map features on the map Map.addLayer(features);
Python
# Load the BigQuery table with a specified geometry column. features = ee.FeatureCollection.loadBigQueryTable( tablePath='my_project.my_dataset.my_table', geometryColumn='geo') print(features.first())
| 主題 | 詳細資料 |
|---|---|
| 先決條件 | 專案必須已啟用 BigQuery API 和 BigQuery Storage API。 |
| 權限 | 除了標準角色和權限之外,您還必須具備目標 BigQuery 資料表的讀取權限,以及在目標專案中建立讀取工作階段的權限。所需的具體 BigQuery 權限如下: - bigquery.tables.get - bigquery.tables.getData - bigquery.readSession.create - bigquery.jobs.create 如要進一步瞭解如何管理權限,請參閱 BigQuery 存取權控管說明文件。 |
| 定價 | 如果您使用的是註冊用於商業用途的 Earth Engine 專案,則讀取 BigQuery 資料表時不會產生額外的 Earth Engine 費用,但您會因在 Earth Engine 中處理資料而產生 ECU 時間費用。具體的定價方案取決於您的 Earth Engine 方案。如果您使用的是註冊為非商業用途的專案,從 BigQuery 讀取資料並將其載入 Earth Engine 時,系統不會向您收取任何費用。雖然您不需要為 BigQuery 使用量付費,但 BigQuery 是商業產品,因此您的專案必須有相關聯的帳單帳戶。如要進一步瞭解帳單帳戶,請參閱說明文件,瞭解如何啟用、停用或變更帳單。注意:在 Private Preview 中,您可能也需要為 BigQuery 資料串流付費。 |
| 限制 | 地圖項目集合篩選器會傳送至 BigQuery 並在該處套用。BigQuery 對收到的篩選器子句有大小限制。如果您看到「filter too big」錯誤訊息,請考慮簡化篩選器。造成這個限制的常見原因,可能是 Earth Engine 中 .filterBounds() 呼叫中使用的複雜幾何圖形。 |
透過 Earth Engine 執行 BigQuery 查詢
ee.FeatureCollection.runBigQuery() 函式會觸發 BigQuery 運算,直接對 BigQuery 資料表評估 SQL 查詢,並以 Earth Engine FeatureCollection 的形式擷取結果。
JavaScript
// Construct a BigQuery query. var query = 'SELECT * FROM my_project.my_dataset.my_table WHERE area > 1000'; // Run the query and retrieve the results as a FeatureCollection. var features = ee.FeatureCollection.runBigQuery(query); // Print the first feature. print(features.first());
Python
# Construct a BigQuery query. query = 'SELECT * FROM my_project.my_dataset.my_table WHERE area > 1000' # Run the query and retrieve the results as a FeatureCollection. features = ee.FeatureCollection.runBigQuery(query) # Print the first feature. print(features.first())
費用
您必須擁有帳單帳戶才能使用這項功能。
Earth Engine
如果您使用的是註冊用於商業用途的 Earth Engine 專案,則執行 BigQuery 資料表時不會產生額外的 Earth Engine 費用,但您需要支付與在 Earth Engine 中處理資料相關的 EECU 時間費用。具體的定價方案取決於您的 Earth Engine 方案。
如果您使用的是註冊為非商業用途的專案,從 BigQuery 讀取資料至 Earth Engine 時,不會產生任何費用。
BigQuery
這個方法會根據您的計價方案 (以量計價或使用運算單元) 產生 BigQuery 費用。如果您有 BigQuery 預留項目,使用這種方法不會產生額外的隨選費用。
| 主題 | 詳細資料 |
|---|---|
| 先決條件 | 您必須擁有帳單帳戶才能使用這個函式,且必須啟用 BigQuery API。 |
| 權限 | 請確認 Earth Engine 服務帳戶具備 BigQuery 和 Earth Engine 的必要權限。用於驗證的使用者憑證必須具備 bigquery.jobs.create 和 bigquery.jobs.get 權限。如要進一步瞭解如何管理權限,請參閱 BigQuery 存取權控管說明文件。 |
| 定價 | 這個方法會根據您的計價方案 (以量計價或有運算單元) 產生 BigQuery 費用。如果您已預留 BigQuery 資源,使用這個方法不會產生額外的隨選費用。如果您使用註冊為商業用途的 Earth Engine 專案,則執行 BigQuery 資料表時不會產生額外的 Earth Engine 費用,但您會因在 Earth Engine 中處理資料而產生 EECU 時間費用。具體的定價方案取決於您的 Earth Engine 方案。如果您使用的是註冊為非商業用途的專案,從 BigQuery 讀取資料並將其載入 Earth Engine 時,不會產生任何費用。 |
成效
除了BigQuery 中的查詢最佳化之外,將結果傳回至 Earth Engine 的效能取決於結果大小 (也就是從 BigQuery 讀取的位元組數量) 和產生結果幾何圖形的複雜度。
篩選器
篩選的最佳做法包括:
- 盡早頻繁篩選:盡可能在資料處理管道的早期套用篩選器,最好是在 BigQuery SQL 查詢中套用。這麼做可減少 Earth Engine 傳輸和處理的資料量。
- 提高選擇性:建立篩選器,選取較小且更明確的資料子集。避免使用過於廣泛的篩選器,以免擷取不必要的資料。
- 結合篩選器:結合多個篩選器條件,有效縮小結果範圍。
- 簡化:盡可能將複雜的篩選器拆解為較簡單的條件,避免篩選字串大小超出 1 MB 的限制。
- 叢集:地理空間查詢在叢集資料欄上執行時,效能可能會更佳。
- 建議在 BigQuery 中進行篩選:為了減少資料大小,建議您在 BigQuery 中執行初步篩選,然後再透過 Earth Engine 進行後續處理。如果無法使用此方法,請在從 BigQuery 載入資料後,在 Earth Engine 指令碼中套用額外篩選器做為後置篩選器。
系統限制
- 400 GB 表格大小限制
- Earth Engine 不允許讀取超過 400 GB 的表格。
- 10 GB 中繼資料表大小
- 每個查詢結果的大小上限為 10 GB。只選擇必要的資料欄,例如新增
LIMIT和WHERE子句,讓查詢更具選擇性。 - Earth Engine 對 BigQuery 中掃描的資料量設有限制。
- 每個查詢結果的大小上限為 10 GB。只選擇必要的資料欄,例如新增
- 轉換後的篩選器字串大小上限為 1 MB
- 複雜的篩選器可能會導致大型篩選字串超過限制。
- 逾時
- Earth Engine 會為查詢套用逾時限制,這可能因領域 (例如批次、線上) 而異。
- BigQuery 限制
- 如要瞭解查詢工作限制的詳細資訊,請參閱 BigQuery 配額說明文件。
控制成本
在 BigQuery 和 Earth Engine 之間移動資料通常不會產生直接費用。不過,傳輸的資料大小會影響 BigQuery 和 Earth Engine 的處理費用。
如果查詢涉及 BigQuery 端的處理作業,則會根據 BigQuery 設定產生 BigQuery 費用。
如果查詢涉及在 Earth Engine 中處理,且您的專案已註冊商業用途,則您將根據 Earth Engine 帳單設定,產生 Earth Engine EECU 時間費用。
記錄和偵錯
讀取作業
使用 ee.FeatureCollection.loadBigQueryTable() 從 BigQuery 讀取資料時,對應的作業不會明確記錄為 BigQuery 中的作業。也就是說,您可能會看到其他沒有對應 BigQuery 讀取工作群組的記錄詳細資料 (例如 Cloud 稽核記錄)。
查詢記錄
使用 ee.FeatureCollection.runBigQuery() 執行的查詢會記錄在專案的 BigQuery 查詢記錄中。您可以透過 Cloud 控制台中的 BigQuery UI 存取查詢記錄。