hadoop - 如何删除多个HDFS目录中最近创建的文件?

标签 hadoop hive hdfs hql hadoop-partitioning

我犯了一个错误,并向按日期划分的表中添加了几百个零件文件。我可以看到哪些文件是新文件(这些文件是我要删除的文件)。我在这里看到的大多数情况都与删除早于特定日期的文件有关,但是我只想删除我最近的文件。

有一天,我可能会有3个文件,我只想删除新文件。我可以告诉我它是新的,因为我使用hadoop fs -ls时有更新时间戳

/this/is/my_directory/event_date1_newfile_20191114
/this/is/my_directory/event_date1_oldfile_20190801
/this/is/my_directory/event_date1_oldfile_20190801

我有很多日期,因此我必须为event_date2,event_date3等完成此操作,并始终从每个日期中删除“new_file_20191114”。

较早的日期是2019年8月,而我的新文件已于昨天11/14/19更新。

我觉得应该有一个简单/快速的解决方案,但是我很难找到大多数人所问的相反情况。

最佳答案

正如您的答案中提到的那样,您已经获得了需要删除的文件列表。
创建一个简单的脚本,将输出重定向到临时文件

像这样

hdfs dfs -ls /tmp | sort -k6,7 > files.txt

请注意对-k6,7进行排序,这将给出所有文件,但按时间戳的排序顺序。我确定您不想删除所有文件,因此可以选择需要删除的前n个文件,例如100

然后您可以将命令更新为
hdfs dfs -ls /tmp | sort -k6,7 | head -100 |  awk '{print $8}' > files.txt

或者,如果您知道新文件的特定时间戳,则可以尝试以下命令
hdfs dfs -ls /tmp | sort -k6,7 | grep "<exact_time_stamp>" |  awk '{print $8}' > files.txt

然后读取该文件并一一删除所有文件
while read file; do
  hdfs -rm $file
  echo "Deleted $file" >> deleted_files.txt #this is to track which files have been deleted

done <files.txt

这样您完成脚本就可以像
#!/bin/bash

 hdfs dfs -ls /tmp | sort -k6,7 | grep "<exact_time_stamp>" |  awk '{print $8}' > files.txt

 while read file; do
     hdfs -rm $file
     echo "Deleted $file" >> deleted_files.txt #this is to track which files have been deleted

   done <files.txt

关于hadoop - 如何删除多个HDFS目录中最近创建的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58877736/

相关文章:

hadoop - 无法在HDFS/config/advanced/custom-core-site中添加新属性

hadoop - Hive中的二进制文件格式字段分隔符重要吗?

hadoop - 从 org.apache.hadoop.hive.ql.exec.DDLTask 创建配置单元表 : FAILED: Execution Error, 返回代码 1 时出错。元异常

hadoop - pig -我可以将结果fs -ls粗化为元组吗?

linux - Hadoop Streaming 没有正确编码字符

hadoop - 在java代码中找到hive-site.xml的位置

hadoop - 如何在Hive中加载定界符输入文件的组合类型?

hadoop - 如何加载和存储nvarchar

linux - java.lang.UnsatisfiedLinkError :/opt/oracle/oraloader-2. 0.0-2/lib/libolh11.so : libclntsh. so.11.1: 无法打开共享对象文件

sql - 如何在 RODBC 的 SQLquery 中使用求和函数