【发布时间】:2018-07-04 10:29:48
【问题描述】:
对于我的用例,我正在处理可通过源中唯一键识别的数据,这些数据会分解为 n(非确定性)数量的目标条目,这些条目已加载到 BigQuery 表中以进行分析。
构建此 ETL 以使用 Mongo 最近的更改流功能我想删除 BigQuery 中的所有条目,然后自动加载新条目。
探索 BigQuery DML 我看到支持 MERGE 操作,但只有 WHEN MATCHED THEN DELETE 或 WHEN MATCHED THEN UPDATE 是可能的。
我对 WHEN MATCHED THEN DELETE,然后是 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_q 和 user_q_incoming 之间的合并:
-
user_q中属于user_id 3的 2 行被删除 -
user_q_incoming中属于user_id 3的 3 行已插入。 -
user_q中的其余数据 (...) 保留在原处,未修改。
5.
BigQuery.user_q 保留
| user_id | q |
...
| 3 | a |
| 3 | b |
| 3 | c |
...
例如,用户可能会从他的个人资料中删除一个问题。将剩余的行保留为q=["a", "c"]。我也需要将其转化为 BigQuery 的世界观。
【问题讨论】:
标签: mongodb google-bigquery etl acid