我正在从事一个电信项目,该项目使用 Hadoop - hive 进行数据分析。一天,我们将获得数百万条记录。在指定天数后,我们需要删除旧数据,因为我们没有存储容量。删除记录的最佳方法是什么?
附加信息:
这些配置单元表将有一个具有填充日期的列。
我认为您的用例非常适合在 Hive 表中使用“日”分区。如果“天”只是一列,那么维护和清理表格将变得很困难。
分区在 Hive 中的真正含义是每个“天”都有一个目录
例如:
create table mytable (
...
) partitioned by (day string)
因此,当您添加数据时,您将在 HDFS 中拥有例如以下结构:
/user/hive/warehouse/mytable/day=2013-01-10
/user/hive/warehouse/mytable/day=2013-01-11
...
在每个分区中,您将拥有当天的内容。
然后删除旧数据变得微不足道,例如,您可以有一个每天运行的 cron 作业并删除 x 天前的数据(例如使用 command date --date '30 days ago' +\%Y-\%m-\%d
),然后只需执行以下命令:
hadoop fs -rmr -skiptrash /user/hive/warehouse/mytable/day=`date --date '30 days ago' +\%Y-\%m-\%d`
此时,如果您对show partitions mytable
已删除数据的分区进行任何查询,您的 Hive 表中仍将保留您的分区,但不会返回任何内容。如果要真正删除元存储中的分区,则必须使用以下命令:
ALTER TABLE mytable DROP PARTITION (day='xxxx-xx-xx');
一段时间以来,我一直在成功使用非常相似的模式,并且效果很好。