2015-08-22 2 views
1

Я хотел бы получить список всех файлов в каталоге и его подкаталогах в файловой системе HDFS. Это метод, который я написал для этой цели рекурсивно чтение всех файлов в каталоге:Как получить абсолютные пути в файловой системе Hadoop?

def getAllFiles(dir: Path, fs: FileSystem, recursive: Boolean = true): Seq[Path] = { 
    val iter = fs.listFiles(dir, recursive) 
    val files = new ListBuffer[Path]() 

    while (iter.hasNext()) { 
    val p = iter.next().getPath 
     files.append(p) 
    } 
    files 
} 

В результате список org.apache.hadoop.fs.Path элементов, которые мне нужно обработать в суб-секвенции шагов. Следовательно, мне нужен полный путь. Мой вопрос: что это лучший способ, чтобы получить полный абсолютный путь

До сих пор я использую рекурсивный метод для создания пути строки (Scala):

def fullPath(p: Path): String = { 
    if (p.isRoot()) 
    p.getName 
    else 
    fullPath(p.getParent) + Path.SEPARATOR + p.getName 
} 

Есть ли не более прямолинеен через API путей?

я столкнулся вопрос #18034758, но с использованием listFiles(), а не listStatus() кажется предпочтительным способ рекурсивен списка файлов в каталоге, так что ответ кажется немного громоздким для этого случая использования.

ответ

0

Метод toString() в org.apache.hadoop.fs.Path возвращает полный путь.

+0

Спасибо! Жаль, что это не описано здесь: https://hadoop.apache.org/docs/stable/api/org/apache/hadoop/fs/Path.html#toString-- – Carsten

1

Возможно, не стоит полагаться на «toString». Что делать, если определение toString изменяется. Я думаю, что лучше сделать что-то вроде

path.toUri().getRawPath() 
Смежные вопросы