amazon-athena - 从 Firehose 中删除重复数据的最佳方法

标签 amazon-athena amazon-kinesis-firehose

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

我的场景:我有多个源,它们将它们的事件作为 JSON 写入 kinesis firehose 流。该流将事件写入 s3 存储桶。应该使用 athena 来分析这些事件。

因此,因为 firehose 不能保证不存在重复项,所以我必须以某种方式对数据进行重复数据删除。而且我还必须以某种方式为 athena 分区它们。

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

  • 使用 EMR 集群(例如每天)进行重复数据删除和分区。但这是成本密集型的​​,并且为了提高成本效益,运行频率不宜超过一天
  • 使用预定的 lambda 函数,它可以对流动时间窗口进行重复数据删除。还有另一个 lambda,用于对数据进行分区。成本:我不知道,因为之前从未使用过 lambda。

有没有更好、更优雅、更节省成本的方式?

最佳答案

首先,我认为您应该考虑清除重复项的值(value)有多大,以及 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 生成的数据查询为-是。您需要创建一个分区表,并将每个小时、每天或每月添加为自己的分区(具体取决于我们正在讨论的数据量)。您可以在不移动数据的情况下做到这一点,但由于无论如何您都必须执行额外的步骤,因此您也可以将重复数据删除也保留在那里 - 如果您确实考虑使用 Glue ETL,那么它对您来说可能比 EMR 的开销更少。

关于amazon-athena - 从 Firehose 中删除重复数据的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50470958/

相关文章:

amazon-web-services - AWS Kinesis Firehose无法将数据索引到AWS Elasticsearch中

amazon-web-services - 从 Python 将数据流式传输到 AWS Kinesis Firehose 的问题

amazon-web-services - AWS Athena 对于 api 来说太慢了?

amazon-web-services - AWS Athena MSCK REPAIR TABLE对于小型数据集而言花费的时间太长

sql - 在 AWS Athena 中连接两个表时选择除一列之外的所有列

amazon-web-services - Kinesis Firehose 是 Kinesis Streams 的替代品吗?

google-cloud-platform - 谷歌云平台 : accumulate data from Pub/Sub to files in Cloud Storage without Dataflow

amazon-web-services - 如何避免 AWS Athena CTAS 查询创建小文件?

sql - 使用 Athena 从 AWS WAF 日志中的规则组列表中获取终止规则

python - 将数据输入Elasticsearch和RabbitMQ的S3的最佳方法是什么?