以增量方式将数据从 GCP Datastore 移动到 BigQuery 的最佳做法

Posted

技术标签:

【中文标题】以增量方式将数据从 GCP Datastore 移动到 BigQuery 的最佳做法【英文标题】:Best practice for moving data from GCP Datastore to BigQuery incrementally 【发布时间】:2018-07-30 20:50:42 【问题描述】:

我们正在从 Datastore 数据源构建我们的数据仓库解决方案。我们希望在预定义的时间间隔内将新插入/更新/删除的数据存储实体加载到 BigQuery 中以进行分析。

似乎有几种选择:

    备份整个类型并将数据加载到 BigQuery。以及 BigQuery 中的重复数据删除。这在概念上非常简单,但每次加载/处理所有数据对我来说似乎效率很低。

    在执行操作并让 Dataflow 订阅和 TL 到 BigQuery 时发布所有新的/更新的/删除的实体。

    在实体上具有最后修改的时间戳,并仅提取在指定时间范围内修改的那些实体。我们想采用这个选项,但是删除的记录似乎有问题,我们必须实现软删除吗?

关于最佳实践的任何建议?

【问题讨论】:

【参考方案1】:

我们已经实现了另一个选项:)

您对所有操作进行 BQ 流式插入(最好使用基于插入时间的分区),然后 - 如果需要,您可以生成合并表(您有每个记录的单个实例 - 因此您正在考虑更新/定期删除)。

我发现有趣的是,这张包含所有(只是流式传输的)非合并数据的表格可能会提供一些非常有趣的见解——比如更新/删除模式——当你合并时它们会消失。

【讨论】:

【参考方案2】:

您的 #1 非常浪费且效率低下。您必须导出所有数据,而不仅仅是您关心的更改的增量。备份+加载过程在GCS中创建中间文件,有点慢,加载还自带limitations。

选项#2 是可行的,但它需要更多的基础设施。更多故障点。

我认为选项 #3 是最好的。就像您已经提到的那样,软删除会有所帮助-您不需要实际删除数据,只需添加active/inactive 标志或deleted_at 时间戳即可。您还需要 updated_atmodified_at 才能使 ETL 递增。

【讨论】:

以上是关于以增量方式将数据从 GCP Datastore 移动到 BigQuery 的最佳做法的主要内容,如果未能解决你的问题,请参考以下文章

从 Google Cloud Datastore 到 BigQuery 的增量数据传输

在不覆盖实时数据库的情况下查询 GCP Datastore 备份

Spring+GCP Datastore:我使用存储库,并希望在开发或测试期间将其配置为使用数据存储模拟器

GCP Datastore Python - InvalidArgument:400 非事务性提交可能不包含影响同一实体的多个突变

比较 GCP 数据存储区查询性能

从 android 客户端将图像存储到 Blobstore 并检索 blobkey 并上传 url 以存储在 Datastore 中。 - 盖伊