以增量方式将数据从 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_at
或 modified_at
才能使 ETL 递增。
【讨论】:
以上是关于以增量方式将数据从 GCP Datastore 移动到 BigQuery 的最佳做法的主要内容,如果未能解决你的问题,请参考以下文章
从 Google Cloud Datastore 到 BigQuery 的增量数据传输
在不覆盖实时数据库的情况下查询 GCP Datastore 备份
Spring+GCP Datastore:我使用存储库,并希望在开发或测试期间将其配置为使用数据存储模拟器
GCP Datastore Python - InvalidArgument:400 非事务性提交可能不包含影响同一实体的多个突变
从 android 客户端将图像存储到 Blobstore 并检索 blobkey 并上传 url 以存储在 Datastore 中。 - 盖伊