将数据导出到 AlloyDB(反向 ETL)
本文档介绍了如何设置从 BigQuery 到 AlloyDB for PostgreSQL 的反向提取、转换和加载(反向 ETL)工作流。您可以使用 EXPORT DATA 语句执行此操作。
准备工作
创建 AlloyDB 集群和实例(包括数据库、架构和表),以接收导出的数据。您必须先拥有目标架构和表,然后才能运行导出作业。
目标 AlloyDB 实例必须是处于
READY状态的PRIMARY实例。创建 BigQuery 连接以连接到 AlloyDB 实例。连接必须通过用户名和密码进行身份验证。连接中指定的数据库用户必须对目标表拥有
INSERT权限,并对目标架构拥有USAGE权限。授予为用户提供执行本文档中的每个任务所需权限的 Identity and Access Management (IAM) 角色。
所需的角色
如需获得将 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 KEY或UNIQUE约束,多次导出相同的数据会导致出现重复条目。为确保数据完整性,我们建议您在 AlloyDB 表中定义
PRIMARY KEY或UNIQUE约束。导出作业不会执行“更新插入”操作,即如果存在唯一匹配的键,则更新现有记录。如果任何传入的行违反了PRIMARY KEY或UNIQUE限制,整个导出作业都会失败。我们不建议同时运行多个
EXPORT DATA作业来处理同一 AlloyDB 表。这样做可能会导致不可预测的行为,例如数据丢失或作业失败。建议您验证是否一次只有一个导出作业写入特定表。仅支持通过 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`;
价格
当您使用 EXPORT DATA 语句将数据导出到 AlloyDB 时,您需要按照 BigQuery 容量计算价格付费。
导出数据后,如果您将数据存储在 AlloyDB 中,则需要为此付费。如需了解详情,请参阅 AlloyDB for PostgreSQL 价格。