복붙노트

[HADOOP] 스칼라 디렉토리에 폴더 나열하기

HADOOP

스칼라 디렉토리에 폴더 나열하기

Scala / Spark를 사용하여 hdfs 디렉토리 내의 모든 폴더를 나열하고 싶습니다. 하둡에서는 다음 명령을 사용하여이 작업을 수행 할 수 있습니다. hadoop fs -ls hdfs : //sandbox.hortonworks.com/demo/

나는 그것을 시도 :

val conf = new Configuration()
val fs = FileSystem.get(new URI("hdfs://sandbox.hortonworks.com/"), conf)

val path = new Path("hdfs://sandbox.hortonworks.com/demo/")

val files = fs.listFiles(path, false)

하지만 내 폴더 / 파일을 찾을 수 없어 Hadoop 디렉토리를 찾지 않는 것 같습니다.

나는 또한 시도 :

FileSystem.get(sc.hadoopConfiguration).listFiles(new Path("hdfs://sandbox.hortonworks.com/demo/"), true)

그러나 이것은 또한 도움이되지 않습니다.

다른 아이디어가 있습니까?

추신 : 나는 또한이 스레드를 확인했습니다 : Spark 반복 HDFS 디렉토리하지만 그것은 hdfs 디렉토리에서 검색하지 않는 것처럼 나에게는 효과적이지 않습니다. 대신 스키마 파일 //이있는 로컬 파일 시스템에서만 검색됩니다.

해결법

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

    1.우리는 hadoop 1.4를 사용하고 listFiles 메소드를 가지고 있지 않으므로 listStatus를 사용하여 디렉토리를 가져온다. 재귀 옵션이 없지만 재귀 조회를 관리하기 쉽습니다.

    우리는 hadoop 1.4를 사용하고 listFiles 메소드를 가지고 있지 않으므로 listStatus를 사용하여 디렉토리를 가져온다. 재귀 옵션이 없지만 재귀 조회를 관리하기 쉽습니다.

    val fs = FileSystem.get(new Configuration())
    val status = fs.listStatus(new Path(YOUR_HDFS_PATH))
    status.foreach(x=> println(x.getPath))
    
  2. ==============================

    2.

       val listStatus = org.apache.hadoop.fs.FileSystem.get(new URI(url), sc.hadoopConfiguration)
    .globStatus(new org.apache.hadoop.fs.Path(url))
    
      for (urlStatus <- listStatus) {
        println("urlStatus get Path:" + urlStatus.getPath())
    

    }

  3. ==============================

    3.

    val spark = SparkSession.builder().appName("Demo").getOrCreate()
    val path = new Path("enter your directory path")
    val fs:FileSystem = projects.getFileSystem(spark.sparkContext.hadoopConfiguration)
    val it = fs.listLocatedStatus(path)
    

    이렇게하면 하위 디렉토리 인 org.apache.hadoop.fs.LocatedFileStatus에 대한 iterator가 작성됩니다.

  4. ==============================

    4.나는 HDFS 대신 S3를 찾고있었습니다.

    나는 HDFS 대신 S3를 찾고있었습니다.

    아래의 S3 경로로 FileSystem을 생성하는 방법을 설명했습니다.

      def getSubFolders(path: String)(implicit sparkContext: SparkContext): Seq[String] = {
        val hadoopConf = sparkContext.hadoopConfiguration
        val uri = new URI(path)
    
        FileSystem.get(uri, hadoopConf).listStatus(new Path(path)).map {
          _.getPath.toString
        }
      }
    

    나는이 질문이 HDFS와 관련이 있다는 것을 알고 있지만, 아마도 나 같은 다른 사람들이 S3 솔루션을 찾고자 할 것입니다. FileSystem에서 URI를 지정하지 않으면 HDFS 파일을 찾게됩니다.

    java.lang.IllegalArgumentException: Wrong FS: s3://<bucket>/dummy_path
    expected: hdfs://<ip-machine>.eu-west-1.compute.internal:8020
    
  5. ==============================

    5.

    object HDFSProgram extends App {    
      val uri = new URI("hdfs://HOSTNAME:PORT")    
      val fs = FileSystem.get(uri,new Configuration())    
      val filePath = new Path("/user/hive/")    
      val status = fs.listStatus(filePath)    
      status.map(sts => sts.getPath).foreach(println)    
    }
    

    이것은 / user / hive /에있는 hdfs 파일 또는 폴더의 목록을 얻는 샘플 코드입니다.

  6. ==============================

    6.Azure Blog Storage는 HDFS 위치에 매핑되므로 모든 Hadoop 작업

    Azure Blog Storage는 HDFS 위치에 매핑되므로 모든 Hadoop 작업

    Azure Portal에서 Storage Account (스토리지 계정)로 이동하면 다음 세부 정보를 찾을 수 있습니다.

    경로 패턴은 HDFS 경로입니다. Hadoop Edge 노드에 / putty를 로그인하고 다음 작업을 수행 할 수 있습니다.

    hadoop fs -ls /users/accountsdata 
    

    위의 명령은 모든 파일을 나열합니다. 스칼라에서는 다음을 사용할 수 있습니다.

    import scala.sys.process._ 
    
    val lsResult = Seq("hadoop","fs","-ls","/users/accountsdata/").!!
    
  7. ==============================

    7.스칼라를 사용하고 있기 때문에 다음에 관심이있을 수 있습니다.

    스칼라를 사용하고 있기 때문에 다음에 관심이있을 수 있습니다.

    import scala.sys.process._
    val lsResult = Seq("hadoop","fs","-ls","hdfs://sandbox.hortonworks.com/demo/").!!
    

    유감스럽게도이 명령의 전체 출력을 문자열로 반환하므로 파일 이름 만 파싱하면 약간의 노력이 필요합니다. 대신 fs.listStatus를 사용하십시오. 그러나 명령 행에서 쉽게 수행 할 수있는 다른 명령을 실행해야하는 경우 스칼라에서 수행하는 방법을 잘 모르는 경우 scala.sys.process를 통해 명령 행을 사용하십시오. _. 리턴 코드를 얻고 싶다면 싱글!을 사용하십시오.

  8. from https://stackoverflow.com/questions/33394884/spark-scala-list-folders-in-directory by cc-by-sa and MIT license