Earth Engine と BigQuery

このドキュメントでは、効率的な地理空間分析のために Google Earth Engine(EE)と BigQuery(BQ)を統合する方法について説明します。2 つのプラットフォーム間のデータ転送、パフォーマンスに関する考慮事項、制限事項、費用への影響について説明します。

BigQuery とは

BigQuery は、ペタバイト規模のデータに対するスケーラブルな分析を可能にする、Google のフルマネージド型サーバーレス データ ウェアハウスです。高速 SQL クエリに優れ、地理空間データをサポートしています。

BigQuery と Earth Engine はどちらをいつ使用すればよいですか?

BigQuery Earth Engine
データ型 主に構造化された分析ベクトル データ。GEOGRAPHY データの地理空間オペレーションをサポートします。 主にラスターデータですが、ベクターデータもサポートしています。
処理 大規模な集計と結合用に最適化された SQL ベースのクエリ。BQ Machine Learning との緊密な統合。 高度な地理空間アルゴリズムや ML など、ラスター処理と分析用の JavaScript と Python の API。
スケール ペタバイト規模のストレージと分析。表形式データの処理に重点を置いています。 ペタバイト規模のストレージと分析。ベクトルデータ処理のスケールに制限がある地理空間分析に重点を置いています。
ユースケース 大規模なベクトル データセットに対するデータ ウェアハウジング、ビジネス インテリジェンス、地理空間分析。 地理空間分析、リモート センシング、環境モニタリング、ラスターデータの機械学習。

ベクターデータとラスターデータ

ベクトルデータは、地表上の点、線、ポリゴンです。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 に書き込む非同期エクスポート ジョブをトリガーします。これらの Earth Engine タスクは、Cloud コンソールのタスクビューまたは 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 でのデータ処理に関連する EECU 時間の費用が発生します。正確な料金体系は、Earth Engine プランによって異なります。非商用目的で登録されたプロジェクトを使用している場合、BigQuery から Earth Engine にデータを読み取る際に料金は発生しません。BigQuery の使用料金は発生しませんが、商用プロダクトである BigQuery を使用するには、プロジェクトに請求先アカウントが関連付けられている必要があります。請求先アカウントの詳細については、課金の有効化、無効化、変更に関するドキュメントをご覧ください。注: 非公開プレビューでは、BigQuery データのストリーミングに対して料金が発生する場合があります。
上限 特徴コレクション フィルタは BigQuery に送信され、そこで適用されます。BigQuery には、受信したフィルタ句のサイズの上限があります。「フィルタが大きすぎます」というエラー メッセージが表示された場合は、フィルタを簡素化することを検討してください。この上限に達する一般的な原因として、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 でのフィルタリングを優先する: データサイズを削減するには、Earth Engine でさらに処理する前に、BigQuery で最初のフィルタリングを行うことをおすすめします。それが不可能な場合は、BigQuery からデータを読み込んだ後、Earth Engine スクリプト内で追加のフィルタをポストフィルタとして適用します。

システム全体の上限

  • 400 GB のテーブルサイズの上限
    • Earth Engine では、400 GB を超えるテーブルの読み取りはできません。
  • 10 GB の中間テーブルサイズ
    • 各クエリ結果は 10 GB に制限されています。LIMIT 句と WHERE 句を追加するなど、必要な列のみを選択して、クエリの選択範囲を絞り込みます。
    • Earth Engine では、BigQuery でスキャンされるデータの量に上限が設定されています。
  • 変換後のフィルタ文字列のサイズの上限は 1 MB
    • 複雑なフィルタを使用すると、フィルタ文字列が長くなり、上限を超える可能性があります。
  • タイムアウト
    • Earth Engine では、クエリにタイムアウトが適用されます。タイムアウトは、レルム(バッチ、オンラインなど)によって異なる場合があります。
  • BigQuery の制限

費用管理

通常、BigQuery と Earth Engine 間でデータを移動しても直接的な費用は発生しません。ただし、転送されるデータのサイズは、BigQuery と Earth Engine の両方で処理費用に影響する可能性があります。

クエリに BigQuery 側での処理が含まれる場合は、BigQuery の構成に応じて BigQuery の料金が発生します。

クエリに Earth Engine 内の処理が含まれ、プロジェクトが商用用途として登録されている場合、Earth Engine の課金構成に従って Earth Engine EECU 時間の料金が発生します。

ログとデバッグ

読み取りオペレーション

ee.FeatureCollection.loadBigQueryTable() を使用して BigQuery からデータを読み取る場合、対応するオペレーションは BigQuery でジョブとして明示的にログに記録されません。つまり、対応する BigQuery 読み取りジョブがない他のロギング詳細(Cloud Audit Logs など)が表示される場合があります。

クエリ履歴

ee.FeatureCollection.runBigQuery() を使用して実行されたクエリは、プロジェクトの BigQuery クエリ履歴に記録されます。クエリ履歴には、Cloud コンソールの BigQuery UI からアクセスできます。