Вы определили рекурсивную функцию, которая генерирует массив (для l oop):
- вывод функции, если элемент является каталогом, который является массивом объектов.
- a
Path
, если это простой файл.
Это объясняет тот факт, что вы получаете вложенные массивы (массив массивов).
Вы можете использовать flatMap
чтобы избежать этой проблемы. Он преобразует (или «выравнивает») список объектов в список объектов. Кроме того, для получения ожидаемого типа вам необходимо иметь совпадающие типы между вашим условием остановки и рекурсией (Array
из Path
). Поэтому вам нужно обернуть hdfsPath
внутри массива.
Вот как можно быстро решить вашу проблему, основываясь на том, что я только что написал:
def recursiveWalk(hdfsPath: Path): Array[Path] = {
val fs: FileSystem = hdfsPath.getFileSystem(spark.sessionState.newHadoopConf())
val fileIterable = fs.listStatus(hdfsPath)
val res = fileIterable.flatMap(f => {
if (f.isDirectory) {
recursiveWalk(f.getPath).distinct
}
else {
Array(hdfsPath)
}
})
res.distinct
}
Приведенный выше код устраняет проблему, но Избегая использования различных, вы можете поместить условие во входной файл вместо его подпапок, как показано ниже. Вы также можете определить файловую систему раз и навсегда вне функции.
val conf = new org.apache.hadoop.conf.Configuration()
val hdfs = org.apache.hadoop.fs.FileSystem(conf)
def recursiveWalk(path : Path): Array[Path] = {
if(hdfs.isDirectory(path))
hdfs.listStatus(path).map(_.getPath).flatMap(rec _) :+ path
else Array()
}