本文档提供了有关将 Google Earth Engine (EE) 与 BigQuery (BQ) 集成以高效地进行地理空间分析的指南。其中涵盖了两个平台之间的数据传输、性能注意事项、限制和费用影响。
什么是 BigQuery?
BigQuery 是 Google 推出的全托管式无服务器数据仓库,可对 PB 级数据进行规模化分析。它非常适合执行高速 SQL 查询,并支持地理空间数据。
何时应使用 BigQuery 或 Earth Engine?
| BigQuery | Earth Engine | |
|---|---|---|
| 数据类型 | 主要为结构化分析矢量数据。支持对 GEOGRAPHY 数据执行地理空间操作。 |
主要为光栅数据,但也支持矢量数据。 |
| 正在处理 | 基于 SQL 的查询,针对大规模聚合和联接进行了优化。与 BQ 机器学习深度集成。 | 用于处理和分析栅格数据的 JavaScript 和 Python API,包括高级地理空间算法和机器学习。 |
| 扩缩 | PB 级存储和分析。专注于表格数据处理。 | PB 级存储和分析。侧重于地理空间分析,但矢量数据处理规模有限。 |
| 用例 | 对大型矢量数据集进行数据仓储、商业智能和地理空间分析。 | 基于光栅数据的地理空间分析、遥感、环境监测、机器学习。 |
矢量和光栅数据
矢量数据是地球表面上的点、线和多边形。在 BigQuery 中,矢量数据使用 GEOGRAPHY 数据类型存储;在 Earth Engine 中,这些是 ee.Geometry 对象。
光栅数据是像素的经过投影的网格。Earth Engine 针对处理大型光栅数据集进行了优化。
同时使用这两种系统的好处
借助 BigQuery 的可伸缩性,您可以处理可能难以仅在 Earth Engine 中处理的海量表格数据集,而 Earth Engine 可以支持 BigQuery 无法实现的大规模丰富和矢量到光栅处理。
与 BigQuery 相比,Earth Engine 支持的地理空间函数和数据范围更广,但 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 中处理数据而产生 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 中进行过滤:为了减小数据大小,最好先在 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 界面访问查询历史记录。