我想根据文件的年龄(天数)删除hdfs中的文件。那里的目录结构有一个固定路径,后跟id/year/month/date/hour/min作为它们的子目录。我仍然是一个初学者,但显而易见的选择似乎是遍历每个文件夹,然后删除。但这里我们讨论的是每小时数百万份文件。我想知道最好的方法。
dsf9zpds1#
基于它们在java中的创建日期不清楚“创建日期”是指文件写入hdfs的时间,还是指文件路径中的时间。我假设是文件路径。在这里,我们讨论的是每小时数以百万计的文档其实并不重要。您可以删除整个文件夹路径,就像常规文件系统一样。只需使用bash和hdfscli。如果您需要一些特殊的东西,那么所有cli文件系统命令都Map到java类。从java中删除hdfs文件夹如果使用bash,则使用 date 命令,减去天数,赋值给一个变量 d . 确保它的格式与目录结构匹配。理想情况下,不要只计算一天。您希望在日期减法计算中计算年和月。然后简单地移除路径中的所有内容
date
d
hadoop fs -rm -R "${FIXED_PATH}/id/$(d}"
您可以在循环bash中删除许多日期:循环日期您需要迭代其他内容的唯一原因是,如果您有要删除的动态id另一种方法是在该数据上创建(分区的)启用了acid的配置单元表。只需执行类似于下面的删除查询(正确考虑日期格式)
DELETE FROM t WHERE CONCAT(year, '-', month, '-', day) < date_sub(current_date(), ${d})
将它安排在cron(或oozie)任务中,让它反复清除旧数据。
1条答案
按热度按时间dsf9zpds1#
基于它们在java中的创建日期
不清楚“创建日期”是指文件写入hdfs的时间,还是指文件路径中的时间。我假设是文件路径。
在这里,我们讨论的是每小时数以百万计的文档
其实并不重要。您可以删除整个文件夹路径,就像常规文件系统一样。只需使用bash和hdfscli。如果您需要一些特殊的东西,那么所有cli文件系统命令都Map到java类。
从java中删除hdfs文件夹
如果使用bash,则使用
date
命令,减去天数,赋值给一个变量d
. 确保它的格式与目录结构匹配。理想情况下,不要只计算一天。您希望在日期减法计算中计算年和月。
然后简单地移除路径中的所有内容
您可以在循环bash中删除许多日期:循环日期
您需要迭代其他内容的唯一原因是,如果您有要删除的动态id
另一种方法是在该数据上创建(分区的)启用了acid的配置单元表。
只需执行类似于下面的删除查询(正确考虑日期格式)
将它安排在cron(或oozie)任务中,让它反复清除旧数据。