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 //を持つローカルファイルシステムでのみ動作するようです。
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))
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
を作成します
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())
}
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)
これが役に立てば幸いです。
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
私は同じものを探していましたが、[〜#〜] 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
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ファイルまたはフォルダーのリストを取得するサンプルコードです。
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/").!!