从 firehose 中删除重复数据的最佳方法

Best way to deduplicate from firehose

对从 firehose 写入 s3 的事件进行重复数据删除的最佳且最节省成本的方法是什么?

我的场景:我有多个源,它们将它们的事件作为 JSON 写入运动流。流将事件写入 s3 存储桶。比事件应该用雅典娜分析。

所以,由于 firehose 不能保证没有重复项,我不得不以某种方式对数据进行重复数据删除。而且我还必须以某种方式为雅典娜划分它们。

到目前为止我想到的方法是:

有没有更好、更优雅、更省钱的方式?

首先,我认为您应该考虑清除重复项的价值,以及 Firehose 实际传送重复项的频率。我认为由于 Firehose 本身而导致重复的情况非常罕见,但是如果您的生产商最终也可能会向您的 Firehose 发送重复项,那么您当然可能仍想处理它。

您应该使用的方法取决于您的用例,如果您提供更多有关它的详细信息,可能更容易为您提供更明确的答案。

如果您没有大量数据,您可以在读取方面付出代价,而不是处理例如重写数据。 SELECT DISTINCT * FROM table 应该删除重复的行。如果您的查询包含聚合,您可以执行 SELECT column, COUNT(*) FROM (SELECT DISTINCT * FROM table) – 或者 SELECT foo, MIN(bar), MIN(baz) GROUP BY 1 的某些变体,如果您有一个应该是唯一的列。由于 Athena 对扫描数据而不是计算资源收费,因此这不会产生额外费用,但当然会更慢。

如果您有大量数据,我不会推荐该解决方案,在这种情况下,我认为您无论如何都需要在管道中执行额外的步骤,因为您也不应该查询由Firehose 原样。您需要创建一个分区 table 并将每小时、每天或每月添加为自己的分区(具体取决于我们谈论的数据量)。您可以在不移动数据的情况下做到这一点,但由于无论如何您都必须有一个额外的步骤,您也可以将重复数据删除也放在那里——如果您确实考虑使用 Glue ETL,它对您来说可能比 EMR 的开销更少。