我正在从事一个电信项目,它使用hadoop-hive进行数据分析。有一天,我们会得到数百万张唱片。在指定的天数之后,我们需要删除旧数据,因为我们没有存储容量。删除记录的最佳方法是什么?其他信息:这些配置单元表将有一个包含填充日期的列。
uz75evzq1#
我认为您的用例非常适合在您的hive表中使用“day”分区。如果“日”只是一栏,那么你的table就很难保养和清洁了。分区在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天前的数据(例如使用命令 date --date '30 days ago' +\%Y-\%m-\%d )只需执行以下命令:
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 但是对删除数据的分区的任何查询都不会返回任何结果。如果要真正删除元存储中的分区,必须使用以下命令:
show partitions mytable
ALTER TABLE mytable DROP PARTITION (day='xxxx-xx-xx');
我已经成功地使用了一个非常相似的模式一段时间了,而且效果很好。
1条答案
按热度按时间uz75evzq1#
我认为您的用例非常适合在您的hive表中使用“day”分区。如果“日”只是一栏,那么你的table就很难保养和清洁了。
分区在hive中的真正含义是,您将为每个“天”拥有一个目录
例如:
因此,当您添加数据时,例如,hdfs中会有以下结构:
在每个分区中,你都会有当天的内容。
然后删除旧数据变得很简单,例如,您可以有一个cron作业,它每天运行并删除x天前的数据(例如使用命令
date --date '30 days ago' +\%Y-\%m-\%d
)只需执行以下命令:此时,如果执行
show partitions mytable
但是对删除数据的分区的任何查询都不会返回任何结果。如果要真正删除元存储中的分区,必须使用以下命令:我已经成功地使用了一个非常相似的模式一段时间了,而且效果很好。