У меня есть каталог каталогов на HDFS, и я хочу перебирать каталоги. Есть ли простой способ сделать это с помощью Spark, используя объект SparkContext?
Исправлять итерацию каталога HDFS
Ответ 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() для получения размера файла, описаны здесь:
Ответ 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()