我正在尝试使用以下代码从spark中删除hive stage文件。此代码可以删除目录中的文件,但我想删除所有以' .hive-staging_hive'开头的文件。
我能否知道从某些文本开始删除目录的方法。
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 :(得分:1)
简单的方法是运行一个进程表单Java程序并使用通配符删除以目录中" .hive-staging_hive" 开头的所有文件。
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();
}
下一个方法是列出目录中的所有文件。过滤以" .hive-staging_hive" 开头的文件并删除它们。
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);
}
希望这有帮助!