GCP Bigquery 中的动态合并

Dynamic merging in GCP Bigquery

我在 GCP Bigquery 中有一个主要 table 和一个暂存 table。主 table 将具有快照数据,暂存 table 将是流 table。我想 运行 合并查询并以一定的时间间隔更新主 table 中的数据。

因为我将使用 MongoDB Debezium 连接器,所以我只会接收一行的更新列,其余列将为空。

正常的合并查询会更新整行,这是不合需要的。

我需要一种方法来仅针对那些特定的列合并 table 中的行,并保持其余列不变。每行要更新的列可以不同。

例如:

Main table data:
id  status  login_id    task_id user_id
71  CLAIMED 13          4373737 2191


Staging table data:
id  status  login_id    task_id user_id
71  null    null        4636282 null

我想要这样的结果:

id  status  login_id    task_id user_id
71  CLAIMED 13          4636282 2191

查询必须为新键插入记录并为现有键更新特定列

可能吗?任何人都可以帮助我吗?

下面的查询应该有效。您需要为每一列创建一个匹配子句,而不是使用单个子句来更新 WHEN MATCHED 上的整行。 WHEN NOT MATCHED BY TARGET 部分保持不变以插入新条目。

merge main T 
using staging S
on T.id = S.id
when matched and S.status is not null then update set T.status = cast(S.status as string)
when matched and S.login_id is not null then update set T.login_id = S.login_id
when matched and S.task_id is not null then update set T.task_id = S.task_id
when matched and S.user_id is not null then update set T.user_id = S.user_id
when not matched by target then insert values (S.id, cast(S.status as string), S.login_id, S.task_id, S.user_id)

我测试过它并且有效。您可能需要转换一些列,因为如果 S 具有 null 值并且 T 是列的 int,bigquery 会抱怨。