在异步实时ETL流水线中去重BigQuery数据

3
我们的数据仓库团队正在评估BigQuery作为数据仓库列存储的解决方案,并对其功能和最佳使用方式提出了一些问题。我们现有的ETL管道通过队列异步消耗事件,并将事件幂等地保留到现有的数据库技术中。幂等架构允许我们偶尔重新播放几个小时或几天的事件,以纠正错误和数据故障,而不会产生重复的风险。
在测试BigQuery时,我们尝试使用实时流插入API并使用唯一键作为insertId。这为我们提供了一种短时间内进行upsert功能的选项,但稍后重新流式传输数据会导致重复。因此,我们需要一种优雅的选项来实现近乎实时的去重,以避免数据差异。
我们有一些问题,并希望得到任何问题的答案。欢迎提供关于在ETL架构中使用BigQuery的任何其他建议。
以下是需要回答的问题:
  • 除了使用tableId之外,是否有常见的实时流去重实现方式?
  • 如果我们尝试使用delsert(通过使用BigQuery API中的删除后跟插入来进行删除),删除是否总是先于插入完成,还是操作异步到达?
  • 是否可能将实时流式处理实现到暂存环境中,然后定期合并到目标表中?这是其他列存储ETL技术的常见解决方案,但我们没有看到任何文档建议在BigQuery中使用它。
1个回答

4
我们允许重复发生,并以这样的方式编写我们的逻辑和查询,使每个实体成为流式数据。例如:用户配置文件是一种流式数据,因此有许多行按时间排列,当我们需要选择最后的数据时,我们使用最近的行。
在我看来,Delsert不太适用,因为您每个表每天只能执行96个DML语句。这意味着您需要在一个表中临时存储批次,以便稍后发出单个DML语句,处理一批行,并从临时表更新实时表。
如果您考虑使用delsert,可能更容易考虑编写一个查询,仅读取最近的行。
流式传输后跟定期合并是可能的。实际上,您可以在同一张表中重新编写一些数据,例如:删除重复项。或者从临时表批量查询内容并写入实时表。这在某种程度上与让重复发生并在查询中稍后处理它相同,也称为重新材料化(如果将其写入同一张表)。

谢谢您的回复,我会与团队讨论并在有任何问题时再与您联系。 - Stewart Spencer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接