构建此ETL以使用Mongo最近的Change Stream功能,我想删除BigQuery中的所有条目,然后以原子方式加载新条目。
通过探索BigQuery DML,我发现支持MERGE操作,但仅支持WHEN MATCHED THEN DELETE
或WHEN MATCHED THEN UPDATE
。
我对WHEN MATCHED THEN DELETE并紧接着插入操作感兴趣。
在保持尽可能原子或最终一致的情况下,如何在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_q
和user_q_incoming
进行合并:
user_id 3
下的user_q
中有2行被删除。user_id 3
下的user_q_incoming
中有3行被插入。user_q
中的其余数据(...
)保持不变。
5.
BigQuery.user_q包含:
| user_id | q |
...
| 3 | a |
| 3 | b |
| 3 | c |
...
例如,用户可能会从他的个人资料中删除一个问题。这将导致剩余的行为
q=["a", "c"]
。我需要将此转化为BigQuery世界观。