使用现有架构将表数据从一个 BigQuery 表流式传输到另一个

Posted

技术标签:

【中文标题】使用现有架构将表数据从一个 BigQuery 表流式传输到另一个【英文标题】:Stream table data from one BigQuery table to another with existing schema 【发布时间】:2020-07-10 14:05:41 【问题描述】:

我有两个 BigQuery 数据集:dataset_adataset_b

每个数据集都包含一个表格,例如 dataset_a_tabledataset_b_table

dataset_a_table 包含流式数据,我想将数据从dataset_a_table 流式传输到dataset_b_table

我有dataset_a_table 类型的TableSchema 架构。如何将流行从一个表复制到另一个表并保留现有架构?

到目前为止,我已经查看了 BigQuery 的 insertAll 方法,但我有点不确定要在哪个数据结构中获取行以及在插入新表时如何指定 TableSchema。

我会很感激有关如何做到这一点的一些指导。谢谢。

【问题讨论】:

【参考方案1】:

方法 1:如果 dataset_b_table 需要简单地镜像 dataset_a_table,例如因为您对两个数据集具有不同的用户权限,您可以考虑将 dataset_b_table 设置为视图而不是表。 BigQuery 中的视图适用于数据集:

CREATE VIEW dataset_b.dataset_b_view AS SELECT * FROM dataset_a.dataset_a_table

方法 2:如果您确实希望 dataset_b_table 与 dataset_a_table 具有相同的架构,则可以使用 BigQuery 原生“传输”功能。 (“传输”>“创建传输”>选择“数据集副本”)

方法 3:如果 dataset_b_table 与 dataset_a_table 具有不同的模式,或者如果 dataset_b_table 已经包含数据并且您想要合并来自 dataset_a_table 的数据,您将需要某种增量逻辑。假设您的 dataset_a_table 有某种“created_at”字段(也假设没有更新记录),那么您可以像这样进行增量加载:

INSERT INTO dataset_b.dataset_b_table
SELECT
   column_a, column_b, column_c, updated_at
FROM dataset_a.dataset_a_table
WHERE updated_at>(SELECT max(updated_at) FROM dataset_b.dataset_b_table)

然后,您可以根据您的时间要求安排此运行,每天、每小时或每几分钟运行一次。您可以使用 BigQuery 原生计划功能或您自己的逻辑。

如果您需要在(毫秒)秒内进行实际流式传输,而 View 方法不适合您,您将需要首先使用填充 dataset_a_table 的源,因为 BigQuery 不支持触​​发器。

【讨论】:

感谢您的详细回复,@Alex。鉴于我的问题的性质,我需要一个流式插入。我想知道在 BigQuery 的 insertAll 中传递现有 TableSchema 的正确语法是什么。 “流式插入”到底是什么意思?您有生成数据流的应用程序吗?如果是这样,为什么它不能流入两个表?如果您使用 BigQuery API,则 insertAll 采用键值对,因此您可以为任何列设置值。 我设法将数据流式传输到第二个表中,就像我在第一个表中所做的那样。我想我不确定在应用程序中更改架构与 BigQuery 的复杂性。感谢您的回复。

以上是关于使用现有架构将表数据从一个 BigQuery 表流式传输到另一个的主要内容,如果未能解决你的问题,请参考以下文章

使用 _PARTITIONTIME 从现有表在 BigQuery 中创建聚簇表

从 DataFlow 加载到现有 BigQuery 表时是不是可以更新架构?

BigQuery 从现有表插入分区表

如何通过 BigQuery 中的 WebUI 导出现有表的架构?

BigQuery 提取表架构

使用 bigquery 中的 bigquery select 语句的 JSON 格式的现有表的架构