【问题标题】:Filter records from Redshift based on records from S3根据来自 S3 的记录过滤来自 Redshift 的记录
【发布时间】:2022-01-08 05:18:33
【问题描述】:

我是 AWS 新手。我正在为以下用例设计解决方案。

我在 S3 中有一个关系数据库的副本,一个存储桶中有几个文件,每个文件代表一个表,列是用竖线分隔的。文件的总大小约为 2 GB。 我还有数十亿条记录分布在 redshift 的多个表中。

我需要根据 S3 中可用的记录(通过连接多个文件)过滤来自 redshift 的记录(通过连接多个表)并将其写入 DB/S3。

示例 - 假设 S3 具有包含产品详细信息的产品文件和包含标准详细信息的标准文件,当标准匹配时,产品应作为建议显示给客户。标准和产品表使用产品 ID 链接。例如,当客户已购买 ipad(条件)时,显示 ipad 配件(产品)作为建议

Redshift 具有包含客户列表的 Customer 表和包含他们购买的产品列表的 Product 表。产品和客户都使用 customerid 链接。

对于基于标准的 S3 中可用的每个产品,我需要根据他们已经购买的产品找到应该向其推荐产品的客户列表。

有人可以提供有关如何在 AWS 中实现这一目标的高层次想法吗?

【问题讨论】:

    标签: amazon-web-services amazon-s3 amazon-redshift


    【解决方案1】:

    查看 Redshift Spectrum,它将允许您定义存在于 S3 中的外部表。外部表将允许您仅从 S3 中提取符合您的条件的记录,然后将此信息加入您的客户表。

    这应该适用于 Spectrum,因为您的 S3 数据不是很大,并且您在将结果传递给 Redshift 之前根据您的标准对其进行缩减。当您的 S3 数据通过简单的 WHERE 子句减少并通过 GROUP BY 减少时,Spectrum 最强大。这使得结果的网络流量在传回 RS 集群时保持较小。

    【讨论】:

    • 感谢您的回复,抱歉,如果我不清楚。对于 S3 中的每条记录(产品 + 标准),我需要找到应该向其推荐产品的客户列表。所以 S3 数据没有被削减,Redshift 中的客户数据必须根据他们已经购买的产品使用 S3 中可用的标准进行过滤。
    • Spectrum 在这种情况下仍然可以工作,但可能会对性能产生一些影响。 S3 中的外部表可以像 Redshift 中的普通表一样被引用。您的 S3 大小并不大,因此对于您的用例而言,网络传输时间可能不是问题。听起来您正在对更大的数据集应用一些 ML 分组。这在 Redshift 中非常可行,查询运行时间的长度可能会超过从 S3 提取 2GB 的网络时间。如果正确,这是您可能会偶尔运行一次的过程,而不是所有其他查询。你应该很好。
    • 如果外部表访问时间被反复击中并且网络开销很高,那么可以在分析期间将 S3 数据加载到临时表中,以便可以多次使用它们。
    • 能否计划/触发此查询以自动运行并将结果存储在 S3 中?例如 - 当一组新文件到达 S3 时,我需要根据 S3 中的新提要和 redshift 中新的可用记录自动重新运行查询?
    • 是,但不是来自 Redshift(无触发器)。这不是一个大问题,因为您可以使用 AWS 的全部功能。您可以从控制台(以及大量其他服务)安排查询,但我希望您真的希望根据 S3 更新触发。最好的方法是使用 Lambda 函数。 S3 对象更新可以触发 Lambda,该 Lambda 可以发出包括 SQL 在内的各种操作。 (或者在 EC2 上,但我喜欢无服务器。)要考虑的一件事是何时触发 - 第一个 S3 对象更改?最后的?你怎么知道最后?等
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多