Oozie 工作流程:如何在 table 中保留最近 30 天

Oozie workflow: how to keep most recent 30 days in the table

我正在尝试构建一个 Hive table 并通过 oozie 将其自动化。 table 中的数据不必早于最近 30 天。

工作流程中的操作每天 运行。它将首先清除 30 天前的数据,然后插入今天的数据。滑动 window 间隔 30 天。

有人可以举例说明如何实现吗?

正如在 How to delete and update a record in Hive(用户 ashtonium)中已经回答的那样,Hive 版本 0.14 提供了 ACID 支持。因此,创建 .hql 脚本并使用简单的 DELETE + where 条件(当前日期使用 unix_timestamp())和 INSERT。 INSERT 应该以批量方式使用,而不是在 OLTP 中使用。

Hive将数据存储在HDFS文件中,这些文件是immutable.

好吧,实际上,随着最近发布的 Hadoop 版本,HDFS 文件可以被追加,甚至可以 运行cated,但是有一个低级别的 API,并且 Hive 有没有通用的方法来修改 text/AVRO/Parquet/ORC/whatever 格式的数据文件,因此出于实际目的,HDFS 文件对于 Hive 是 immutable。

一个解决方法是使用 事务性 ORC tables,每个 create/rewrite 一个完整的数据文件 "transaction" -- 需要背景定期压缩由此产生的混乱的过程(例如,将小文件重写为更大文件的另一个步骤)。

另一种解决方法是 临时批量重写 table 每当您想删除旧数据时 - 例如每 2 周,运行 一个批次删除超过 30 天的数据。

>简约设计

  • 确保在清除结束之前没有 INSERT 或 SELECT 运行ning
  • 创建一个新的 partioned table 具有相同的结构加上一个虚拟 分区列
  • 将所有要保留的数据复制到该虚拟分区
  • 运行 一个 EXCHANGE PARTITION 命令
  • 删除分区 table
  • 现在旧数据已经消失,您可以恢复 INSERTs

> 替代设计,允许在清除 运行ning

时插入
  • 使用虚拟分区键重建 table,并确保 所有 INSERT 总是进入 "current" 分区
  • 在清除时,将 "current" 分区重命名为 "to_be_purged" (并且 确保在清除结束之前 运行 不会 SELECT,否则 你可能会得到重复的)
  • 将所有要保留的数据从"to_be_purged"复制到"current"
  • 删除分区"to_be_purged"
  • 现在旧数据不见了

但是 如果您的 table 以 ISO 格式(即 YYYY-MM)按月分区,那将会简单得多。在那种情况下,您可以只获取分区列表并删除所有具有键 "older" 的分区而不是(当前月份 -1),使用普通的 bash 脚本.相信我,它简单而坚如磐石。