外部表简介

本页面介绍外部表,并提供有关如何查询存储在 BigQuery 外部的数据的指南。

利用非 BigLake 外部表,您可以查询外部数据存储区中的结构化数据。如需查询非 BigLake 外部表,您必须拥有外部表和外部数据源的权限。例如,如需查询使用 Cloud Storage 中的数据源的非 BigLake 外部表,您必须拥有以下权限:

  • bigquery.tables.getData
  • bigquery.jobs.create
  • storage.buckets.get
  • storage.objects.get

支持的数据存储区

您可以将非 BigLake 外部表与以下数据存储区搭配使用:

临时表支持

您可以使用永久表或临时表在 BigQuery 中查询外部数据源。永久表是在数据集中创建的表,该表链接到外部数据源。由于该表是永久性的,因此您可以使用访问权限控制与其他同样有权访问底层外部数据源的人员共享该表,还可以随时查询该表。

使用临时表查询外部数据源时,您需要提交一个命令,该命令必须包含查询并创建一个链接到外部数据源的非永久表。使用临时表时,不会在任何 BigQuery 数据集内创建表。由于该表并非永久存储在数据集内,因此无法与他人共享。使用临时表查询外部数据源适用于对外部数据进行一次性临时查询,或执行提取、转换和加载 (ETL) 过程。

多个源文件

如果您是基于 Cloud Storage 创建非 BigLake 外部表,则可以使用多个外部数据源,不过这些数据源必须具有相同的架构。基于 Bigtable 或 Google 云端硬盘的非 BigLake 外部表不支持多个源文件。

限制

外部表存在以下限制:

  • BigQuery 不保证外部数据表的数据一致性。在查询运行的过程中,底层数据的更改可能导致意外行为。
  • 与查询标准 BigQuery 表中的数据时相比,外部表的查询性能可能速度较慢。如果需要优先考虑查询速度,请将数据加载到 BigQuery 中,而不是设置外部数据源。如果查询包含外部表,则其性能取决于外部存储类型。例如,查询存储在 Cloud Storage 中的数据比查询存储在 Google 云端硬盘中的数据速度更快。一般而言,外部表的查询性能应等同于直接从数据源读取数据。
  • 您不能使用 DML 或其他方法修改外部数据表。外部表对于 BigQuery 为只读。
  • 您无法使用 TableDataList JSON API 方法从外部表中检索数据。如需了解详情,请参阅 tabledata.list

    若要绕过此限制,您可以将查询结果保存在目标表中。随后,您可以在结果表上使用 TableDataList 方法。

  • 您无法运行从外部表导出数据的 BigQuery 作业。

    若要绕过此限制,您可以将查询结果保存在目标表中。随后,您可以针对结果表运行导出作业。

  • 您不能在通配符表查询中引用外部表。

  • 外部表不支持聚类。它们以有限的方式支持分区。如需了解详情,请参阅查询外部分区数据

  • 查询除 Cloud Storage 以外的外部数据源时,系统不会缓存结果。(支持 Cloud Storage 上的 GoogleSQL 查询。)即使您多次发出相同的查询,也需要为针对外部表发出的每条查询付费。如果您需要对某个不常更改的外部表反复发出查询,可以考虑将查询结果写入永久表,并改为对该永久表运行查询。

  • 您最多只能对 Bigtable 外部数据源执行 16 个并发查询。

  • 使用外部表的联合查询的试运行可能会报告 0 字节数据的下限,即使返回行也是如此。这是因为在实际查询完成之前,无法确定从外部表处理的数据量。运行联合查询会产生处理此数据的费用。

  • 您不能在外部表中使用 _object_metadata 作为列名。预留给内部使用。

  • BigQuery 不支持显示外部表的表存储统计信息。

位置注意事项

在选择数据的位置时,请考虑以下事项:

Cloud Storage

您可以通过以下方式使用 BigQuery 与 Cloud Storage 数据交互:

查询 Cloud Storage 数据

使用 BigLake非 BigLake 外部表查询 Cloud Storage 中的数据时,您查询的数据必须与您的 BigQuery 数据集位于同一位置。例如:

  • 单区域存储桶:如果您的 BigQuery 数据集位于华沙 (europe-central2) 区域,则相应的 Cloud Storage 存储桶也必须位于华沙区域或任何包含华沙的 Cloud Storage 双区域。如果您的 BigQuery 数据集位于 US 多区域,则 Cloud Storage 存储桶可以位于 US 多区域、爱荷华州 (us-central1) 单区域或任何包含爱荷华州的双区域。来自任何其他单区域的查询都会失败,即使存储桶位于数据集的多区域包含的位置也是如此。例如,如果外部表位于 US 多区域,并且 Cloud Storage 存储桶位于俄勒冈州 (us-west1),则作业将失败。

    如果您的 BigQuery 数据集位于 EU 多区域,则 Cloud Storage 存储桶可以位于 EU 多区域、比利时 (europe-west1) 单区域或任何包含比利时的双区域。来自任何其他单区域的查询都会失败,即使存储桶位于数据集的多区域包含的位置也是如此。例如,如果外部表位于 EU 多区域,并且 Cloud Storage 存储桶位于华沙 (europe-central2),则作业将失败。

  • 双区域存储桶:如果您的 BigQuery 数据集位于东京 (asia-northeast1) 区域,则相应的 Cloud Storage 存储桶必须位于东京区域,或者包含东京的双区域(例如 ASIA1 双区域)。如需了解详情,请参阅创建双区域存储桶

    如果 Cloud Storage 存储桶位于 NAM4 双区域或任何包含爱荷华州 (us-central1) 区域的双区域,则相应的 BigQuery 数据集可以位于 US 多区域或爱荷华州 (us-central1)。

    如果 Cloud Storage 存储桶位于 EUR4 双区域或任何包含比利时 (europe-west1) 区域的双区域,则相应的 BigQuery 数据集可以位于 EU 多区域或比利时 (europe-west1)。

  • 多区域存储桶推荐将包含多区域 Cloud Storage 存储桶的多区域数据集位置用于外部表,因为外部查询性能取决于最小延迟和最佳网络带宽。

    如果您的 BigQuery 数据集位于 US 多区域,则相应的 Cloud Storage 存储桶必须位于 US 多区域、包含爱荷华州 (us-central1) 的双区域(例如 NAM4 双区域)或包含爱荷华州 (us-central1) 的自定义双区域。

    如果您的 BigQuery 数据集位于 EU 多区域,则相应的 Cloud Storage 存储桶必须位于 EU 多区域、包含比利时 (europe-west1) 的双区域(例如 EUR4 双区域)或包含比利时的自定义双区域。

如需详细了解受支持的 Cloud Storage 位置,请参阅 Cloud Storage 文档中的存储桶位置

从 Cloud Storage 加载数据

使用 BigLake 或非 BigLake 外部表从 Cloud Storage 加载数据时,您加载的数据必须与您的 BigQuery 数据集位于同一位置。

  • 如果您的 BigQuery 数据集位于 US 多区域,则您可以从位于任何位置的 Cloud Storage 存储桶加载数据。

  • 多区域存储桶:如果您要从中加载数据的 Cloud Storage 存储桶位于多区域存储桶,则您的 BigQuery 数据集可以位于同一多区域存储桶或同一多区域存储桶中包含的任何单区域。例如,如果 Cloud Storage 存储桶位于 EU 区域,则您的 BigQuery 数据集可以位于 EU 多区域或 EU 中的任何单区域。
  • 双区域存储桶:如果您要从中加载数据的 Cloud Storage 存储桶位于双区域存储桶,则您的 BigQuery 数据集可以位于该双区域存储桶中包含的区域,或包含该双区域的多区域。例如,如果您的 Cloud Storage 存储桶位于 EUR4 区域,则您的 BigQuery 数据集可以位于芬兰 (europe-north1) 单区域、荷兰 (europe-west4) 单区域或 EU 多区域。

    如需了解详情,请参阅创建双区域存储桶

  • 单区域存储桶:如果您要从中加载数据的 Cloud Storage 存储桶位于单区域,则您的 BigQuery 数据集可以位于同一单区域,或包含该单区域的多区域。例如,如果您的 Cloud Storage 存储桶位于芬兰 (europe-north1) 区域,则您的 BigQuery 数据集可以位于芬兰或 EU 多区域。

  • 一个例外情况是,如果您的 BigQuery 数据集位于 asia-northeast1 区域,则您的 Cloud Storage 存储桶可以位于 EU 多区域。

如需了解详情,请参阅批量加载数据

将数据导出到 Cloud Storage

共置 Cloud Storage 存储桶,以导出数据:
  • 如果您的 BigQuery 数据集位于 EU 多区域,则包含您所导出的数据的 Cloud Storage 存储桶必须位于同一多区域或该多区域内的位置。例如,如果您的 BigQuery 数据集位于 EU 多区域,则 Cloud Storage 存储桶可以位于欧盟内的 europe-west1 比利时区域。

    如果您的数据集位于 US 多区域,则您可以将数据导出到任何位置的 Cloud Storage 存储桶。

  • 如果您的数据集位于某个区域,则 Cloud Storage 存储桶必须位于同一区域。例如,如果您的数据集位于 asia-northeast1 东京区域,则您的 Cloud Storage 存储桶不能位于 ASIA 多区域。

如需了解详情,请参阅导出表数据

Bigtable

通过 BigQuery 外部表查询 Bigtable 中的数据时,您的 Bigtable 实例必须与 BigQuery 数据集位于同一位置。

  • 单区域:如果您的 BigQuery 数据集位于比利时 (europe-west1) 区域位置,则相应的 Bigtable 实例必须也位于比利时区域。
  • 多区域:因为外部查询性能取决于最小延迟时间和最佳网络带宽,所以建议对 Bigtable 上的外部表使用多区域数据集位置。

如需详细了解支持的 Bigtable 位置,请参阅 Bigtable 位置

Google 云端硬盘

位置注意事项不适用于 Google 云端硬盘外部数据源。

数据管理

    制定数据管理计划:
    • 如果您选择区域存储资源(如 BigQuery 数据集或 Cloud Storage 存储桶),请制定按地理位置管理数据的计划。

在各位置之间移动数据

如需手动将数据集从一个位置移动到另一个位置,请按照以下步骤操作:

  1. 数据从 BigQuery 表导出到数据集所在位置中的 Cloud Storage 存储桶或数据集内某个位置中的 Cloud Storage 存储桶。例如,如果数据集位于 EU 多区域位置,则可以将数据导出到位于欧盟内的 europe-west1 比利时位置。

    从 BigQuery 导出数据不会产生费用,但是将导出的数据存储在 Cloud Storage 中会产生费用。BigQuery 导出操作需要遵循导出作业的相关限制。

  2. 将数据从导出 Cloud Storage 存储桶复制或移动到您在目标位置创建的新存储桶。例如,如果您要将数据从 US 多区域移动到 asia-northeast1 东京区域,则需要将数据转移到您在东京创建的存储桶。如需了解如何转移 Cloud Storage 对象,请参阅 Cloud Storage 文档中的复制、重命名和移动对象

    在区域之间转移数据会在 Cloud Storage 中产生网络出站流量费用

  3. 在新位置创建新的 BigQuery 数据集,然后将数据从 Cloud Storage 存储桶加载到新数据集。

    您不需要为将数据加载到 BigQuery 而付费,但在删除数据或存储桶之前,您需要为在 Cloud Storage 中存储数据支付费用。数据加载完毕后,在 BigQuery 中存储数据也须支付费用。将数据加载到 BigQuery 会受到加载作业限制。

您还可以使用 Cloud Composer 以编程方式移动和复制大型数据集。

如需详细了解如何使用 Cloud Storage 存储和移动大型数据集,请参阅使用 Cloud Storage 处理大数据

价格

从 BigQuery 查询外部表时,您需要为运行查询和读取的适用字节(如果使用 BigQuery 按需[每 TiB] 价格)或槽使用量(如果使用 BigQuery 容量[每槽小时]价格)付费。

如果您的数据以 ORC 或 Parquet 格式存储在 Cloud Storage 中,请参阅数据大小计算

根据应用的价格指南,您还需要为存储源应用所用的数据和任何资源付费:

  • 如需了解 Cloud Storage 价格,请参阅 Cloud Storage 价格
  • 如需了解 Bigtable 价格,请参阅价格
  • 如需了解云端硬盘价格,请参阅价格

后续步骤