使用 MapReduce 防止重复到 BigQuery 管道

Posted

技术标签:

【中文标题】使用 MapReduce 防止重复到 BigQuery 管道【英文标题】:Preventing duplicates with MapReduce to BigQuery pipeline 【发布时间】:2012-06-13 01:59:48 【问题描述】:

我在这里阅读了 Michael 对这篇文章的回答,其中建议使用管道将数据从数据存储移动到云存储再到大查询。

Google App Engine: Using Big Query on datastore?

我想使用这种技术将数据附加到 bigquery 表中。这意味着我必须有某种方式知道实体是否已被处理,因此它们不会在 mapreduce 运行期间重复提交给 bigquery。我不想每次都重建我的表。

在我看来,我有两个选择。我可以在实体上放置一个标志,并在处理每个实体时对其进行更新,并在后续运行中将其过滤掉 - 或者 - 我可以将每个实体保存到一个新表中并将其从源表中删除。第二种方法似乎更好,但我想询问选项或看看是否有任何陷阱

【问题讨论】:

【参考方案1】:

假设您有一些活动流表示为实体,您可以使用query cursors 在前一个查询中断的地方启动一个查询。查询游标非常适合您所描述的增量情况类型,因为它们避免了将实体标记为已处理的开销。

我必须四处看看 App Engine MapReduce 是否支持光标(我怀疑它还不支持)。

【讨论】:

我已经使用了查询游标,即使是扇出,我也检查了它们在我的用例中的用法。问题是能够在扇出情况下最终确定我正在写入的 blob。由于扇出会产生子作业,因此在我的情况下很难确定一切何时完成,并且我不想编写 cron 作业来检查 blob。这就是为什么我要尝试使用管道真正干净地协调事情。对于我的用例,准确性和可追溯性是最重要的。 我可能遗漏了一些关于您的情况的关键信息。通常要做的事情是在查询结束时完成 blob,同时获取(并保存)查询光标,以便以后可以从中断的地方继续。 其他人可以回答这个问题吗?上面的答案是不可接受的。 您的第一个选项对我来说听起来不错。您可以使用 MapReduce API 在某种标志实体上过滤您的对象。好吧,这个选项还没有工作,因为它被窃听了,但它应该有一天会做。检查此链接***.com/a/11851856/1387380。

以上是关于使用 MapReduce 防止重复到 BigQuery 管道的主要内容,如果未能解决你的问题,请参考以下文章

Mapreduce - 保留输入顺序

一个简单的MapReduce示例(多个MapReduce任务处理)

使用Session防止表单重复提交

如何使用 UIImageViewExtension 与 Swift 异步加载图像并防止重复图像或错误图像加载到单元格

使用MongoDB MapReduce方法执行sql查询[重复]

Java 使用Token令牌防止表单重复提交