6

我正在从事一个电信项目,该项目使用 Hadoop - hive 进行数据分析。一天,我们将获得数百万条记录。在指定天数后,我们需要删除旧数据,因为我们没有存储容量。删除记录的最佳方法是什么?

附加信息:

这些配置单元表将有一个具有填充日期的列。

4

1 回答 1

12

我认为您的用例非常适合在 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');

一段时间以来,我一直在成功使用非常相似的模式,并且效果很好。

于 2013-01-11T16:08:05.917 回答