【发布时间】:2018-07-16 00:13:00
【问题描述】:
我想根据文件的年龄(天数)删除我们 hdf 中的文件。
那里的目录结构有一个固定的路径,后跟 id/year/month/date/hour/min 作为它们的子目录。
我在这里仍然是初学者,但显而易见的选择看起来像是遍历每个文件夹然后删除。
但在这里,我们每小时讨论数百万份文档。
我想知道最好的方法。
【问题讨论】:
我想根据文件的年龄(天数)删除我们 hdf 中的文件。
那里的目录结构有一个固定的路径,后跟 id/year/month/date/hour/min 作为它们的子目录。
我在这里仍然是初学者,但显而易见的选择看起来像是遍历每个文件夹然后删除。
但在这里,我们每小时讨论数百万份文档。
我想知道最好的方法。
【问题讨论】:
基于它们在 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)任务中,让它反复清理旧数据。
【讨论】:
SimpleDateFormat 和 FileSystem 类 API hadoop.apache.org/docs/r2.7.3/api/index.html?org/apache/hadoop/…