【问题标题】:How to efficiently delete data from Redshift?如何有效地从 Redshift 中删除数据?
【发布时间】:2019-11-05 21:09:43
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 删除/更新然后运行真空和分析有什么问题?桌子总是可用的吗?你在担心什么吗?请详细说明。
  • 你能澄清一下你真正想要做什么吗?您只是想清除一数据,还是尝试删除选择性数据?
  • @johnRotenstein 我想根据加载日期删除选择性行。
  • @joscott 我们有大量数据,执行删除操作会很慢。这就是为什么我正在寻找可以有效删除数据的任何其他选项。是的,桌子总是可用的。
  • 您能告诉我们更多有关您要删除的数据的信息吗?比如说,一整天的数据吗?表中存储了多少天的数据?

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


【解决方案1】:

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

在这种情况下,Redshift 有一个推荐的方法“时间序列表”:


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

当您想在某个时间窗口之后删除数据时,您可以简单地删除整个表/将其从视图定义中删除。无需真空/分析/昂贵的查询。

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

【讨论】:

    【解决方案2】:

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

    因此,一种方法是对垃圾数据执行 DELETE。您应该尝试处理多行,而不是一一删除。由于每次写入都发生在 1 MB 的数据块中,我们最终应该尽量减少这些数据的读取和写入。

    如果您对存储在 Redshift 计算节点和切片中的数据的拓扑结构有很好的了解,除了有关分布键和排序键的信息之外,您还可以将 DELETE 命令分成多个语句。 (我们期望 Redshift SQL 引擎如何为 SQL 开发人员执行此操作)

    【讨论】:

      猜你喜欢
      • 2018-08-29
      • 2020-02-07
      • 1970-01-01
      • 2021-11-01
      • 2021-06-18
      • 2014-08-22
      • 1970-01-01
      • 1970-01-01
      • 2014-05-20
      相关资源
      最近更新 更多