2017-06-08 1 views
1

Ich versuche, Stock-Dateien von funke mit dem folgenden Code zu löschen. Dieser Code kann Dateien in einem Verzeichnis löschen, aber ich möchte alle Dateien löschen, die mit '.hive-staging_hive' beginnen.Löschen von Verzeichnissen beginnend mit bestimmten Namen von HDFS in Java

Kann ich den Weg kennen, die Verzeichnisse zu löschen, die mit bestimmtem Text beginnen.

Configuration conf = new Configuration(); 
      System.out.println("560"); 
      Path output = new Path("hdfs://abcd/apps/hive/warehouse/mytest.db/cdri/.hive-staging_hive_2017-06-08_20-45-20_776_7391890064363958834-1/"); 
      FileSystem hdfs = FileSystem.get(conf); 

      System.out.println("564"); 

      // delete existing directory 
      if (hdfs.exists(output)) { 
       System.out.println("568"); 
       hdfs.delete(output, true); 
       System.out.println("570"); 

      } 
+0

Ich denke, dass Sie dies mit einem Shell-Skript leicht tun können. Bist du offen für eine Bash-Lösung? – philantrovert

Antwort

1

Der einfache Weg ist, ein Verfahren Form Java-Programm und verwenden Sie einen Platzhalter laufen alle Dateien zu löschen, mit „.hive-staging_hive“ in einem Verzeichnis zu starten.

String command="hadoop fs -rm pathToDirectory/.hive-staging_hive*"; 
int exitValue; 
try { 
    Process process = Runtime.getRuntime().exec(command); 
    process.waitFor(); 
    exitValue = process.exitValue(); 
}catch (Exception e) { 
    System.out.println("Cannot run command"); 
    e.printStackTrace(); 
} 

Die nächste Möglichkeit besteht darin, alle Dateien in den Verzeichnissen aufzulisten. Filtern Sie die Dateien, die mit ".hive-staging_hive" beginnen, und löschen Sie sie.

Configuration conf = new Configuration(); 

Path path = new Path("hdfs://localhost:9000/tmp"); 

FileSystem fs = FileSystem.get(path.toUri(), conf); 

FileStatus[] fileStatus = fs.listStatus(path); 

List<FileStatus> filesToDelete = new ArrayList<FileStatus>(); 

for (FileStatus file: fileStatus) { 

    if (file.getPath().getName().startsWith(".hive-staging_hive")){ 
     filesToDelete.add(file); 
    } 
} 


for (int i=0; i<filesToDelete.size();i++){ 
    fs.delete(filesToDelete.get(i).getPath(), true); 
} 

Hoffe, das hilft!

+0

Danke Shankar. Der zweite Ansatz, den Sie genannt haben, ist hilfreich. Ich habe das versucht .. aber sie ziehen nicht ".hive-staging_hive" Verzeichnisse. Ich erhalte nur die regulären Partitionsverzeichnisse. Kann ich wissen, warum sie keine Staging-Verzeichnisse ziehen? – AKC

+0

Wenn ich den ersten Ansatz Earilier versuche, bekomme ich 'Hadoop Befehl nicht gefunden' Fehler. Mein Spark-Cluster befindet sich außerhalb des Hadoop-Clusters. Kann sein, dass mein Funkenprogramm 'hadoop fs' Befehl nicht zum hadoop Cluster einreicht. – AKC

+0

Hallo @AKC Ich habe den zweiten Teil der Antwort aktualisiert, der funktionieren sollte. Ich habe es auch im Lokal getestet. –

Verwandte Themen