过滤加载到 Redshift 中的数据

Posted

技术标签:

【中文标题】过滤加载到 Redshift 中的数据【英文标题】:Filtering data loaded into Redshift 【发布时间】:2019-07-11 08:36:22 【问题描述】:

我们将原始数据作为 parquet 存储在 S3 中。 我想要将该数据的一个子集加载到 Redshift 中。 需要明确的是,Redshift 数据将是原始数据查询(连接、过滤器、聚合)的结果。

我原本以为我可以在 Athena 中构建视图,并将结果加载到 Redshift 中 - 但似乎没有那么简单!

Glue ETL 作业需要 S3 或 RDS 源 - 不接受来自 Athena 的视图。 (也无法抓取视图)。

下一个解决方案是使用 Athena CTAS 功能,将视图结果写入 S3,然后加载到 RedShift。 但是,CTAS 没有“覆盖”选项。

所以问题... 有没有更简单的方法来解决这个问题? (似乎是一个简单的要求) 是否有一个简单的解决方法来执行具有“覆盖”行为的 CTAS? 有了这个,就必须是一个可以捆绑到计划作业中的解决方案——而且我认为这已经导致了一个自定义脚本。

当一项简单的工作变得如此困难时 - 我不禁想我错过了一些简单的事情!?

谢谢

【问题讨论】:

【参考方案1】:

Ol' 可靠:使用 lambda! Lambda 函数可以以编程方式连接到 s3 和 redshift 以执行 SQL 语句,并且对于触发 lambda 的内容有很多选择(如果它只是一次性的,你可以让它成为一个预定的 lambda)。您也可以使用 cloudwatch 日志来检查该过程。

但请注意:我注意到您将数据存储为镶木地板……普通 Redshift 不支持镶木地板格式的数据。因此,如果您想存储结构等类型,则需要使用 Redshift Spectrum。

【讨论】:

谢谢,我去看看能不能把它搞定——我的第一个 lambda !会回来报告的。 我终于设法让它工作了。看起来很复杂——删除现有的 CTAS 表和相关的 S3 文件,调用 SQL 来创建新的 CTAS,以便结果转到 S3,然后截断并将 S3 复制到 Redshift。同时,在 CTAS 和 Redshift Copy 运行时,lambda 一直在运行——因此产生了不必要的成本。尽管如此,它仍然有效!我确信我会寻找更精简和简单的解决方案,但现在这只是基本的简介,所以谢谢。 很高兴你能成功!似乎您可能有一个多余的步骤...从您在问题中描述的方式来看,流程似乎应该如下:创建与您的 s3 存储桶和 redshift 的连接,查询 s3 存储桶以获取压缩数据,然后遍历结果集并将它们插入 Redshift。但我可能误解了你的问题。 Lambda 也非常便宜……除了运行时/内存特别小/大的少数情况。 您描述的缩短流程可以工作,但从维护和组织的角度来看,不热衷于将查询逻辑隐藏在 lambda 代码中 - 尤其是在有数十或数百个视图时。

以上是关于过滤加载到 Redshift 中的数据的主要内容,如果未能解决你的问题,请参考以下文章

aws Glue / Redshift 的预过滤解决方案(在加载到 S3 之前)

GCP BigQuery 数据传输服务中的错误:找不到适合 jdbc:redshift:// 的驱动程序

Redshift中的存储过程将数据加载到表中

从 Postgres 加载之前的 Pyspark 过滤结果(不要先加载整个表)

Redshift 终止长时间运行的查询

如何将拆分的 gzip 文件中的数据加载到 redshift 中?