【问题标题】:Dynamic merging in GCP BigqueryGCP Bigquery 中的动态合并
【发布时间】:2021-02-08 09:06:22
【问题描述】:

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

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

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

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

例如:

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

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

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

【问题讨论】:

  • 我的回答能解决你的问题吗?

标签: sql google-bigquery cdc


【解决方案1】:

下面的查询应该可以工作。您需要为每列创建一个匹配子句,而不是使用单个子句来更新 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 会报错。

【讨论】:

  • 这个解决方案看起来不错。唯一的问题是它是否适用于重复模式的嵌套字段。不知道如何在其中循环并检查空值。
猜你喜欢
  • 1970-01-01
  • 2015-03-09
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2021-09-04
  • 2020-07-28
  • 2020-07-21
相关资源
最近更新 更多