将数据导出到 AlloyDB(反向 ETL)
通过从 BigQuery 到 AlloyDB for PostgreSQL 的反向提取、转换和加载(反向 ETL)工作流,您可以将数据从 BigQuery 移动到 AlloyDB 数据库。您可以使用 EXPORT DATA 语句在导出数据之前通过查询处理或过滤数据,也可以将 BigQuery 表同步到 AlloyDB 以复制或镜像整个表。
准备工作
创建一个 AlloyDB 集群和实例(包括数据库、架构和表),以接收导出的数据。在运行导出作业之前,您必须具有目标架构和表。
目标 AlloyDB 实例必须是处于
READY状态的PRIMARY实例。创建 BigQuery 连接以连接到 AlloyDB 实例。连接必须通过用户名和密码进行身份验证。连接中指定的数据库用户必须对目标表具有
INSERT权限,对目标架构具有USAGE权限。如需使用此功能,您必须创建 BigQuery 企业版或企业 Plus 版层级预留。只有具有
QUERY分配关系的预留才支持导出到 AlloyDB。授予为用户提供执行本文档中的每个任务所需权限的 Identity and Access Management (IAM) 角色。
所需的角色
如需获得将 BigQuery 数据导出到 AlloyDB 所需的权限,请让管理员向您授予项目的以下 IAM 角色:
-
从 BigQuery 表导出数据:BigQuery 数据视图 (
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 KEY或UNIQUE限制条件,则多次导出相同数据会导致条目重复。为确保数据完整性,我们建议您在 AlloyDB 表上定义
PRIMARY KEY或UNIQUE约束条件。导出作业不会执行“upsert”操作,即在存在唯一匹配键时更新现有记录。如果任何传入行违反了PRIMARY KEY或UNIQUE限制条件,则整个导出作业都将失败。我们不建议针对同一 AlloyDB 表运行多个并发
EXPORT DATA作业。这样做可能会导致不可预测的行为,例如数据丢失或作业失败。我们建议您验证一次只有一个导出作业写入特定表。仅支持通过 BigQuery 连接进行用户名和密码身份验证。
不支持
ARRAY、BYTES、GEOGRAPHY、INTERVAL和STRUCTBigQuery 数据类型。如果 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`;
同步要导出的表
对于全表复制或无需基于 SQL 的转换的自动镜像,您可以将 BigQuery 表直接同步到 AlloyDB。虽然 EXPORT DATA 语句可让您在移动数据之前使用 SELECT 查询来处理、别名化或过滤数据,但您可以使用表同步功能对 BigQuery 表进行一对一迁移。
表同步功能支持以下模式:
- 一次性导入:在 AlloyDB 中创建 BigQuery 表的可写独立副本。
- 定期同步(镜像):在 AlloyDB 中创建一个只读本地表,该表会按照定义的时间表自动从 BigQuery 刷新。
如需了解详情,请参阅将 BigQuery 数据同步到 AlloyDB。
价格
当您使用 EXPORT DATA 语句将数据导出到 AlloyDB 时,您需要按照 BigQuery 容量计算价格付费。
导出数据后,如果您将数据存储在 AlloyDB 中,则需要为此付费。如需了解详情,请参阅 AlloyDB for PostgreSQL 价格。