将数据导出到 AlloyDB(反向 ETL)

本文档介绍了如何设置从 BigQuery 到 AlloyDB for PostgreSQL 的反向提取、转换和加载(反向 ETL)工作流。您可以使用 EXPORT DATA 语句执行此操作。

准备工作

所需的角色

如需获得将 BigQuery 数据导出到 AlloyDB 所需的权限,请让管理员向您授予项目的以下 IAM 角色:

  • 从 BigQuery 表导出数据:BigQuery Data Viewer (roles/bigquery.dataViewer)
  • 运行提取作业: BigQuery User (roles/bigquery.user)
  • 使用 BigQuery 连接: BigQuery Connection User (roles/bigquery.connectionUser)
  • 连接到 AlloyDB 实例:AlloyDB Client (roles/alloydb.client) - 连接服务账号

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

限制

  • AlloyDB 导出仅支持批量导出。您无法使用持续查询将数据导出到 AlloyDB。

  • 导出到 AlloyDB 的数据会以新行的形式添加。导出过程不会修改或删除 AlloyDB 中的现有记录。如果目标表未定义 PRIMARY KEYUNIQUE 约束,多次导出相同的数据会导致出现重复条目。

  • 为确保数据完整性,我们建议您在 AlloyDB 表中定义 PRIMARY KEYUNIQUE 约束。导出作业不会执行“更新插入”操作,即如果存在唯一匹配的键,则更新现有记录。如果任何传入的行违反了 PRIMARY KEYUNIQUE 限制,整个导出作业都会失败。

  • 我们不建议同时运行多个 EXPORT DATA 作业来处理同一 AlloyDB 表。这样做可能会导致不可预测的行为,例如数据丢失或作业失败。建议您验证是否一次只有一个导出作业写入特定表。

  • 仅支持通过 BigQuery 连接进行用户名和密码身份验证。

  • 不支持 ARRAYBYTESGEOGRAPHYINTERVALSTRUCT BigQuery 数据类型。

  • 如果 BigQuery SELECT 语句省略了目标 AlloyDB 表中存在的列,则这些列必须允许 NULL 值或在 AlloyDB 中定义了默认值。如果它们具有 NOT NULL 限制条件,但没有默认值,则导出将失败。

  • 只有 BigQuery 企业版或企业 Plus 版支持导出到 AlloyDB。不支持 BigQuery 标准版和按需计算。如需了解详情,请参阅管理功能

  • BigQuery 作业(例如提取到 AlloyDB 的作业)的最长时长为 6 小时。对于非常大的导出,我们建议将导出分解为多个较小的作业。

位置注意事项

将数据导出到 AlloyDB 时,对 BigQuery 数据集和 AlloyDB 实例的位置有特定要求:

  • 同区域导出:目标 AlloyDB 实例必须与 BigQuery 数据集位于完全相同的 Google Cloud 区域。例如,us-east1 中的数据集只能导出到 us-east1 中的 AlloyDB 实例。

  • 多区域导出

    • US 多区域中的数据集只能导出到位于 us-central1 区域中的 AlloyDB 实例。
    • EU 多区域中的数据集只能导出到位于 europe-west4 区域中的 AlloyDB 实例。

不支持除上述组合之外的跨区域导出。

使用 alloydb_options 配置导出

您可以使用 alloydb_options 选项指定目标 AlloyDB 架构、表和最大连接数。配置以 JSON 字符串的形式表示。只有 table 参数是必需的,所有其他参数都是可选的。

配置导出时,SELECT 语句中的列必须具有与目标 AlloyDB 表中的列名称匹配的别名。

EXPORT DATA
  WITH CONNECTION `PROJECT_ID.LOCATION.CONNECTION_ID`
  OPTIONS(
    format='ALLOYDB',
    uri="https://alloydb.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/clusters/CLUSTER_ID/instances/INSTANCE_ID",
    alloydb_options="""{
      "schema": "SCHEMA_NAME",
      "table": "TABLE_NAME",
      "max_parallel_connections": MAX_CONNECTIONS
    }"""
  )
AS SELECT * FROM `mydataset.table1`;

替换以下内容:

  • PROJECT_ID:您的 Google Cloud 项目的名称。
  • LOCATION:连接和目标实例的位置。
  • CONNECTION_ID:BigQuery 连接的名称。
  • CLUSTER_ID:AlloyDB 集群的名称。
  • INSTANCE_ID:目标 AlloyDB 实例的名称。
  • SCHEMA_NAME(可选):AlloyDB 中目标架构的名称。如果未提供,则使用为数据库用户配置的默认架构。
  • TABLE_NAME:AlloyDB 中现有目标表的名称,不带架构前缀。
  • MAX_CONNECTIONS(可选):从 BigQuery 工作器到 AlloyDB 实例的并发并行连接数上限。限制连接数可以防止在大量导出期间目标实例过载。

导出数据

您可以使用 EXPORT DATA 语句将数据从 BigQuery 表导出到 AlloyDB 表。

以下示例将名为 mydataset.table1 的表中的选定字段导出到名为 my_target_table 的 AlloyDB 表中:

EXPORT DATA
  WITH CONNECTION `myproject.us-central1.my-alloydb-conn`
  OPTIONS (
    format='ALLOYDB',
    uri="https://alloydb.googleapis.com/v1/projects/myproject/locations/us-central1/clusters/my-cluster/instances/my-instance",
    alloydb_options="""{
      "schema": "public",
      "table": "my_target_table"
    }"""
  )
AS SELECT
  col1 AS id,
  col2 AS name,
  col3 AS value
FROM
  `mydataset.table1`;

价格

当您使用 EXPORT DATA 语句将数据导出到 AlloyDB 时,您需要按照 BigQuery 容量计算价格付费。

导出数据后,如果您将数据存储在 AlloyDB 中,则需要为此付费。如需了解详情,请参阅 AlloyDB for PostgreSQL 价格