外部表简介

本文档介绍了如何在外部表中处理存储在 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 不支持显示外部表的表存储统计信息。
  • 外部表不支持灵活的列名称

位置注意事项

为外部表选择位置时,您需要同时考虑 BigQuery 数据集的位置和外部数据源的位置。

Cloud Storage

使用 BigLake非 BigLake 外部表查询 Cloud Storage 中的数据时,存储桶必须与包含外部表定义的 BigQuery 数据集位于同一位置。例如:

  • 单区域存储分区

    如果您的 Cloud Storage 存储桶位于 us-central1(爱荷华州)区域,则您的 BigQuery 数据集必须位于 us-central1(爱荷华州)区域或 US 多区域。

    如果您的 Cloud Storage 存储桶位于 europe-west4(荷兰)区域,则您的 BigQuery 数据集必须位于 europe-west4(荷兰)或 EU 多区域。

    如果您的 Cloud Storage 存储桶位于 europe-west1(比利时)区域,则相应的 BigQuery 数据集也必须位于 europe-west1(比利时)区域。

  • 双区域存储分区

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

    如果您的 Cloud Storage 存储桶位于 EUR4 预定义双区域或任何包含 europe-west4(荷兰)区域的可配置双区域,则相应的 BigQuery 数据集必须位于 europe-west4(荷兰)区域 EU 多区域。

    如果您的 Cloud Storage 存储桶位于 ASIA1 预定义双区域,则相应的 BigQuery 数据集必须位于 asia-northeast1(东京) asia-northeast2(大阪)区域。

    如果您的 Cloud Storage 存储桶使用包含 australia-southeast1(悉尼)和 australia-southeast2(墨尔本)区域的可配置双区域,则相应的 BigQuery 存储桶必须位于 australia-southeast1(悉尼) australia-southeast2(墨尔本)区域。

  • 多区域存储分区

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

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

    如果您的 BigQuery 数据集位于 EU 多区域,则相应的 Cloud Storage 存储桶必须位于 EU 多区域、包含 europe-west4(荷兰)的双区域(例如 EUR4 双区域)或包含 europe-west4 的可配置双区域。

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

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 价格,请参阅价格
  • 如需了解云端硬盘价格,请参阅价格

后续步骤