Spark Scala список папок в каталоге
Я хочу перечислить все папки в каталоге hdfs с помощью Scala/Spark.
В 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: Я также проверил эту тему: Искажать каталог HDFS, но он не работает для меня, поскольку он, похоже, не ищет в каталоге hdfs, а только на локальная файловая система с файлом схемы//.
Ответы
Ответ 1
Мы используем hasoop 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
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
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
поверх org.apache.hadoop.fs.LocatedFileStatus
, который является вашим подкаталогом
Ответ 4
Я искал то же самое, но вместо HDFS, для S3.
Я решил создать FileSystem с моим пути S3, как показано ниже:
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. Поскольку без указания URI в FileSystem, он будет искать HDFS.
java.lang.IllegalArgumentException: Wrong FS: s3://<bucket>/dummy_path
expected: hdfs://<ip-machine>.eu-west-1.compute.internal:8020
Ответ 5
В 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)
Надеюсь, это полезно.
Ответ 6
в 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
Ответ 7
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)
}
Это пример кода для получения списка файлов или папки hdfs, находящихся под/user/hive/
Ответ 8
Azure Blog Storage сопоставляется с местоположением HDFS, поэтому все операции Hadoop
В Azure Portal перейдите в Аккаунт хранилища, вы найдете следующие сведения:
-
Аккаунт хранилища
-
Ключ -
-
Контейнер -
-
Шаблон пути -/users/accountsdata/
-
Формат даты - yyyy-mm-dd
-
Формат сериализации событий - json
-
Формат - выделенная строка
Path Pattern - это путь HDFS, вы можете войти/замаскировать в Hadoop Edge Node и сделать:
hadoop fs -ls /users/accountsdata
Выше команда отобразит все файлы. В Scala вы можете использовать
import scala.sys.process._
val lsResult = Seq("hadoop","fs","-ls","/users/accountsdata/").!!
Ответ 9
Поскольку вы используете Scala, вас также может заинтересовать следующее:
import scala.sys.process._
val lsResult = Seq("hadoop","fs","-ls","hdfs://sandbox.hortonworks.com/demo/").!!
Это, к сожалению, вернет весь вывод команды в виде строки, поэтому для разбора только имен файлов требуется некоторое усилие. (Вместо этого используйте fs.listStatus
.) Но если вам нужно запустить другие команды, где вы можете легко это сделать в командной строке и не знаете, как это сделать в Scala, просто используйте командную строку через scala.sys.process._
. (Используйте один !
, если вы хотите просто получить код возврата.)