복붙노트

[HADOOP] HDFS : Java / Scala API를 사용하여 여러 파일 이동

HADOOP

HDFS : Java / Scala API를 사용하여 여러 파일 이동

주어진 정규 표현식에 해당하는 여러 파일을 Java / Scala 프로그램을 사용하여 HDFS로 옮길 필요가 있습니다. 예를 들어, 이름이 * .xml 인 모든 파일을 폴더 a에서 폴더 b로 이동해야합니다.

셸 명령을 사용하면 다음을 사용할 수 있습니다.

bin/hdfs dfs -mv a/*.xml b/

FileSystem 클래스에서 이름 바꾸기 메소드를 사용하여 다음 코드 (스칼라 언어)를 사용하여 Java API를 사용하여 단일 파일을 이동할 수 있습니다.

// Prepare initial configuration
val conf = new Configuration()
conf.set("fs.defaultFS", "hdfs://hdfs:9000/user/root")
val fs = FileSystem.get(conf)
// Move a single file
val ok = fs.rename(new Path("a/file.xml"), new Path("b/file.xml"));

내가 아는 한 Path 클래스는 URI를 나타냅니다. 그렇다면 다음과 같은 방식으로 사용할 수 없습니다.

val ok = fs.rename(new Path("a/*.xml"), new Path("b/"));

Java / Scala API를 통해 HDFS에서 파일 세트를 이동하는 방법이 있습니까?

해결법

  1. ==============================

    1.fs.rename (새 경로 ( "a"), 새 경로 ( "b"))를 사용할 수 있습니다.

    fs.rename (새 경로 ( "a"), 새 경로 ( "b"))를 사용할 수 있습니다.

    그러나 * .xml을 갖고 싶으면 globfilter와 같은 필터 파일이 있습니다.

    FileSystem fs = FileSystem.get(URI.create(arg0[0]), conf);
    Path path = new Path(arg0[0] + arg0[1]); // arg0[1] NYSE_201[2-3]
    //arg0[0] is base path
    //ar0[1] uses regular expression
    
    FileStatus[] status = fs.globStatus(path);
    Path[] paths = FileUtil.stat2Paths(status);
    for (Path p : paths) {
        // <loops all the source paths>
        // <need to implement logic to rename the paths using fs.rename>
    }
    
  2. from https://stackoverflow.com/questions/34087020/hdfs-move-multiple-files-using-java-scala-api by cc-by-sa and MIT license