hadoop—在java中从hdfs中删除以特定名称开头的目录

hgtggwj0  于 2021-06-01  发布在  Hadoop
关注(0)|答案(1)|浏览(692)

我正在尝试使用下面的代码从spark中删除hive stage文件。此代码可以删除目录中的文件,但我要删除以“.hive-staging\u 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");

            }
6l7fqoea

6l7fqoea1#

最简单的方法是从java程序运行一个进程,并使用通配符删除目录中以“.hive-staging\u 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\u 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);
}

希望这有帮助!

相关问题