Исправлять итерацию каталога HDFS

У меня есть каталог каталогов на HDFS, и я хочу перебирать каталоги. Есть ли простой способ сделать это с помощью Spark, используя объект SparkContext?

Ответ 1

Вы можете использовать org.apache.hadoop.fs.FileSystem. В частности, FileSystem.listFiles([path], true)

И с искрой...

FileSystem.get(sc.hadoopConfiguration).listFiles(..., true)

Edit

Стоит отметить, что хорошей практикой является получение FileSystem, связанного со схемой Path.

path.getFileSystem(sc.hadoopConfiguration).listFiles(path, true)

Ответ 2

Вот версия PySpark, если кому-то интересно:

hadoop = sc._jvm.org.apache.hadoop

fs = hadoop.fs.FileSystem
conf = hadoop.conf.Configuration() 
path = hadoop.fs.Path('/hivewarehouse/disc_mrt.db/unified_fact/')

for f in fs.get(conf).listStatus(path):
    print f.getPath()

В этом конкретном случае я получаю список всех файлов, которые составляют таблицу Hive disc_mrt.unified_fact.

Другие методы объекта FileStatus, такие как getLen() для получения размера файла, описаны здесь:

Класс FileStatus

Ответ 3

import  org.apache.hadoop.fs.{FileSystem,Path}

FileSystem.get( sc.hadoopConfiguration ).listStatus( new Path("hdfs:///tmp")).foreach( x => println(x.getPath ))

Это сработало для меня.

Искра версия 1.5.0-cdh5.5.2

Ответ 4

это сделало всю работу за меня

FileSystem.get(new URI("hdfs://HAservice:9000"), sc.hadoopConfiguration).listStatus( new Path("/tmp/")).foreach( x => println(x.getPath ))

Ответ 5

@Tagar не сказал, как подключить удаленные hdfs, но этот ответ сделал:

URI           = sc._gateway.jvm.java.net.URI
Path          = sc._gateway.jvm.org.apache.hadoop.fs.Path
FileSystem    = sc._gateway.jvm.org.apache.hadoop.fs.FileSystem
Configuration = sc._gateway.jvm.org.apache.hadoop.conf.Configuration


fs = FileSystem.get(URI("hdfs://somehost:8020"), Configuration())

status = fs.listStatus(Path('/some_dir/yet_another_one_dir/'))

for fileStatus in status:
    print(fileStatus.getPath())

Ответ 6

Вы также можете проверить состояние globStatus

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())
}

Ответ 7

Scala Файловая система (API Apache Hadoop Main 3.2.1)

import org.apache.hadoop.fs.{FileSystem, Path}

val fileSystem : FileSystem = {
    val conf = new Configuration()
    conf.set( "fs.defaultFS", "hdfs://to_file_path" )
    FileSystem.get( conf )
}

val files = fileSystem.listFiles( new Path( path ), false )
val filenames = ListBuffer[ String ]( )
while ( files.hasNext ) files.next().getPath().toString()