gpt4 book ai didi

mongodb - BigQuery 中的行级原子 MERGE REPLACE

转载 作者:可可西里 更新时间:2023-11-01 10:02:00 25 4
gpt4 key购买 nike

对于我的用例,我正在处理可通过源唯一键识别的数据,这些数据分解为 n 个(非确定性)目标条目,并加载到 BigQuery 表中以用于分析目的。

构建此 ETL 以使用 Mongo 最近的 Change Stream 功能我想删除 BigQuery 中的所有条目,然后以原子方式加载新条目。

探索 BigQuery DML 我看到一个 MERGE支持操作,但只有 WHEN MATCHED THEN DELETEWHEN MATCHED THEN UPDATE 是可能的。

我对 WHEN MATCHED THEN DELETE, AND FOLLOW BY INSERT 操作感兴趣。

我如何在 BigQuery 中实现此类 ETL,同时在数据可用性和正确性方面尽可能保持原子性或最终一致性。


编辑 1:我想提供一个具体的例子来详细说明。

我对这个数据集唯一性的最低粒度是user_id。行不是唯一可识别的。

示例

1.

从 mongo 更改流接收到更新的用户对象:

user={_id: "3", name="max", registered="2018-07-05" q=["a", "b", "c"]}

2.

当前 BigQuery.user_q 持有

| user_id | q |
...
| 3 | a |
| 3 | b |
...

3.

转换代码将修改后的用户对象加载到 BigQuery.user_q_incoming

| user_id | q |
| 3 | a |
| 3 | b |
| 3 | c |

4.

user_quser_q_incoming 之间合并:

  1. user_q 中属于 user_id 3 的 2 行已删除
  2. user_q_incoming 中属于 user_id 3 的 3 行已插入。
  3. user_q 中的其余数据 (...) 保留原样,未修改。

5.

BigQuery.user_q 持有

| user_id | q |
...
| 3 | a |
| 3 | b |
| 3 | c |
...

例如,用户可能会从他的个人资料中删除一个问题。将剩余的行保留为 q=["a", "c"]。我还需要将其转化为 BigQuery 世界观。

最佳答案

BigQuery DML 支持 INSERT

A MERGE statement is a DML statement that can combine INSERT, UPDATE, and DELETE operations into a single statement and perform the operations atomically.

例如

MERGE dataset.Inventory T
USING dataset.NewArrivals S
ON FALSE
WHEN NOT MATCHED AND product LIKE '%washer%' THEN
INSERT (product, quantity) VALUES(product, quantity)
WHEN NOT MATCHED BY SOURCE AND product LIKE '%washer%' THEN
DELETE

所以,你应该好好使用你的 ETL

EDIT based on more specific details added to question

好的,我明白了——我认为在这种情况下 MERGE 将不适用,因为 INSERT 只能用于 NOT MATCH 子句。在这种情况下,有人可能会想出如何欺骗 MERGE 来工作,但与此同时,下面的解决方案可以实现您想要实现的目标 - 我认为是这样 :o)

CREATE OR REPLACE TABLE `project.dataset.user_q` (user_id INT64, q STRING) AS
SELECT * FROM `project.dataset.user_q`
WHERE NOT user_id IN (SELECT DISTINCT user_id FROM `project.dataset.user_q_incoming`)
UNION ALL
SELECT * FROM `project.dataset.user_q_incoming`
WHERE user_id IN (SELECT DISTINCT user_id FROM `project.dataset.user_q`)

关于mongodb - BigQuery 中的行级原子 MERGE REPLACE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51171517/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com