将数据导出到 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约束。导出作业不会执行“upsert”,即在存在唯一匹配键时更新现有记录。如果有任何传入行违反了PRIMARY KEY或UNIQUE约束,则整个导出作业将失败。我们不建议对同一 AlloyDB 表运行多个并发
EXPORT DATA作业。这样做可能会导致不可预测的行为,例如数据丢失或作业失败。我们建议您验证一次只有一个导出作业写入特定表。仅支持通过 BigQuery 连接进行用户名和密码身份验证。
不支持
ARRAY、BYTES、GEOGRAPHY、INTERVAL和STRUCTBigQuery 数据类型。如果 BigQuery
SELECT语句省略了目标 AlloyDB 表中存在的列,则这些列必须允许NULL值,或者在 AlloyDB 中定义了默认值。如果它们具有NOT NULL约束且没有默认值,则导出将失败。只有 BigQuery Enterprise 或企业 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 worker 到 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 价格。