我想根据年龄(没有天数)删除hdfs中的文件 目录结构有一个固定的路径,后跟id / year / month / date / hour / min作为子目录。
我仍然是初学者,但显而易见的选择看起来像遍历每个文件夹然后删除。
但在这里,我们每小时都在谈论数百万份文件 我想知道解决这个问题的最佳方法。
答案 0 :(得分:0)
基于他们在Java中的创建日期
不清楚“创建日期”是指文件写入HDFS的时间,还是文件路径中的文件。我假设它是文件路径。
这里我们每小时都在谈论数百万份文件
无关紧要。您可以删除整个文件夹路径,例如常规文件系统。只需使用bash和hdfs cli。如果您需要特殊的东西,所有CLI文件系统命令都将映射到Java类。
如果使用bash,请使用date
命令计算日期,减去天数,分配给变量,让我们说d
。确保它的格式与目录结构相匹配。
理想情况下,不要只计算一天。您希望在日期减法计算中计算年数和月数。
然后只需删除路径中的所有内容
hadoop fs -rm -R "${FIXED_PATH}/id/$(d}"
您可以在循环中删除许多日期 - Bash: Looping through dates
您需要迭代其他任何内容的唯一原因是,如果您有要删除的动态ID
另一种方法是在该数据上创建(分区)ACID-enabled Hive table。
只需执行类似于以下的删除查询(正确计算日期格式)
DELETE FROM t
WHERE CONCAT(year, '-', month, '-', day) < date_sub(current_date(), ${d})
在cron(或Oozie)任务中安排它,让它重复清理旧数据。