web-dev-qa-db-ja.com

Spark Scalaディレクトリ内のフォルダを一覧表示

Scala/Sparkを使用してhdfsディレクトリ内のすべてのフォルダーを一覧表示したい。 Hadoopでは、次のコマンドを使用してこれを行うことができます: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)

しかし、これも役に立ちません。

他にアイデアはありますか?

PS:私もこのスレッドをチェックしました: Spark iterate HDFS directory しかし、それはhdfsディレクトリで検索するようには見えず、代わりにスキーマfile //を持つローカルファイルシステムでのみ動作するようです。

25
AlexL

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))
30
nil
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)

これは、サブディレクトリであるイテレータit over org.Apache.hadoop.fs.LocatedFileStatusを作成します

3
Lejla
   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
Nitin

Spark 2.0+、

import org.Apache.hadoop.fs.{FileSystem, Path}
val fs = FileSystem.get(spark.sparkContext.hadoopConfiguration)
fs.listStatus(new Path(s"${hdfs-path}")).filter(_.isDir).map(_.getPath).foreach(println)

これが役に立てば幸いです。

1
Ajay Ahuja

ajay Ahujasの回答isDirは非推奨です。

isDirectory...を使用します.

package examples

    import org.Apache.log4j.Level
    import org.Apache.spark.sql.SparkSession

    object ListHDFSDirectories  extends  App{
      val logger = org.Apache.log4j.Logger.getLogger("org")
      logger.setLevel(Level.WARN)
      val spark = SparkSession.builder()
        .appName(this.getClass.getName)
        .config("spark.master", "local[*]").getOrCreate()

      val hdfspath = "." // your path here
      import org.Apache.hadoop.fs.{FileSystem, Path}
      val fs = org.Apache.hadoop.fs.FileSystem.get(spark.sparkContext.hadoopConfiguration)
      fs.listStatus(new Path(s"${hdfspath}")).filter(_.isDirectory).map(_.getPath).foreach(println)
    }

結果:

file:/Users/user/codebase/myproject/target
file:/Users/user/codebase/myproject/Rel
file:/Users/user/codebase/myproject/spark-warehouse
file:/Users/user/codebase/myproject/metastore_db
file:/Users/user/codebase/myproject/.idea
file:/Users/user/codebase/myproject/src
1
user3190018

私は同じものを探していましたが、[〜#〜] hdfs [〜#〜]の代わりにS​​を探していました。

以下のように、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
1
Franzi
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ファイルまたはフォルダーのリストを取得するサンプルコードです。

0

Azure Blog StorageはHDFSロケーションにマップされるため、すべてのHadoopオペレーション

Azure Portal で、ストレージアカウントに移動すると、次の詳細が表示されます。

  • ストレージアカウント

  • キー-

  • コンテナ-

  • パスパターン-/ users/accountsdata /

  • 日付形式– yyyy-mm-dd

  • イベントのシリアル化形式– json

  • フォーマット-行区切り

ここでのパスパターンはHDFSパスです。HadoopEdgeにログイン/ PuTTYすることができますNodeそして

hadoop fs -ls /users/accountsdata 

上記のコマンドは、すべてのファイルをリストします。 In Scalaを使用できます

import scala.sys.process._ 

val lsResult = Seq("hadoop","fs","-ls","/users/accountsdata/").!!
0
Yogesh_JavaJ2EE