如何有效地从Redshift删除数据?

时间:2019-06-24 05:10:06

标签: python amazon-web-services pyspark bigdata amazon-redshift

我的Redshift集群中有数据。重新运行作业时,我需要找到删除先前存储的数据的最佳,有效方法。

我有这两列来确定先前的数据previous_key(对应于run_dt的列)和creat_ts(加载数据的时间)

到目前为止,我发现了两种方法,但是它们不能有效地起作用:

  • 使用sql DELETE命令–可能很慢,最终需要对表进行吸尘以回收存储空间并重新排序行
  • 将表中的数据卸载到S3上的文件中,然后通过过滤掉max clndr_key将表重新加载(截断和插入)。也不是很好,可能会有风险。

请提出在Redshift集群上重新运行作业的任何好的方法。 注意:分区功能不可用。

2 个答案:

答案 0 :(得分:1)

使用DELETE命令删除Redshift中存储的数据将花费一些时间。原因是您正在执行软删除,我的意思是将现有行标记为已删除,然后插入代表数据更新形式的新行。

所以一种方法是对垃圾数据执行DELETE。与其一一删除,不如尝试解决多行问题。由于每次写入均以1 MB的数据块进行,因此我们应最终减少对这些数据的读写。

如果您对Redshift计算节点和片中存储的数据的拓扑有很好的了解,除了有关分发键和排序键的信息之外,还可以将DELETE命令分成多个语句。 (我们期望Redshift SQL Engine如何为SQL开发人员做到这一点)

答案 1 :(得分:0)

听起来您想在特定时间段后删除数据。

在这种情况下,Redshift建议使用“时间序列表”方法:


基本上,您为固定时间窗口的每次插入都创建一个新表。然后,此数据的主界面是UNION将所有这些表放在一起的视图。

要在时间窗口后删除数据时,只需删除整个表/将其从视图定义中删除即可。无需真空/分析/昂贵的查询。

来源: https://docs.aws.amazon.com/redshift/latest/dg/c_best-practices-time-series-tables.html