从Scala中的HDFS返回路径

从Scala中的HDFS返回路径,scala,hadoop,apache-spark,Scala,Hadoop,Apache Spark,我想返回一个文件夹所在的文件路径,并在该文件夹中搜索“零件”文件 def listDirectoriesGetPartFile(folderPath: String): org.apache.hadoop.fs.Path { val path = new Path(folderPath) if (fileSystem.isDirectory(path)) { val st = fileSystem.listStatus(path) for (i <- 0 until st.l

我想返回一个文件夹所在的文件路径,并在该文件夹中搜索“零件”文件

def listDirectoriesGetPartFile(folderPath: String): org.apache.hadoop.fs.Path  {

val path = new Path(folderPath)
 if (fileSystem.isDirectory(path)) {
  val st = fileSystem.listStatus(path)
  for (i <- 0 until st.length) {
    if (st(i).getPath.getName.toString().trim().contains("part")) {
      st(i).getPath
    }
  }

 }
 ????
}
def listDirectoriesGetPartFile(folderPath:String):org.apache.hadoop.fs.Path{
val路径=新路径(folderPath)
if(fileSystem.isDirectory(path)){
val st=fileSystem.listStatus(路径)
对于(i,这里有几个选项(按照Scala习惯用法的升序排列)。如果找不到匹配的文件,我假设您希望此选项返回
null
(尽管强烈不推荐):

使用可变var

def listDirectoriesGetPartFile(folderPath: String): Path = {
  val path = new Path(folderPath)
  var result: Path = null // use a var with a default value
  if (fileSystem.isDirectory(path)) {
    val st = fileSystem.listStatus(path)
    // update the value of result if we found what we're looking for
    result = st.map(_.getPath).find(_.getName.trim.contains("part")).orNull
  }
  result // return the var
}
在Scala中使用if-else,一切都是一个表达式,因此if-else表达式可以是返回值:

def listDirectoriesGetPartFile(folderPath: String): Path = {
  val path = new Path(folderPath)
  if (fileSystem.isDirectory(path)) {
    val st = fileSystem.listStatus(path)
    st.map(_.getPath).find(_.getName.trim.contains("part")).orNull
  } else {
    null
  }
}
更改签名以返回选项:因为此方法可能找到您要查找的路径,但可能找不到(如果给定路径不是文件夹,或者文件夹中不存在此类文件),最好是返回类型传递这种可能性-这就是可以使用Scala的
选项的地方。为了方便起见,我还将用模式匹配替换if-else,但这不是必须的:

def listDirectoriesGetPartFile(folderPath: String): Option[Path] = {
  new Path(folderPath) match {
    case p if fileSystem.isDirectory(p) => fileSystem.listStatus(p)
      .map(_.getPath)
      .find(_.getName.trim.contains("part"))
    case _ => None
  }
}

如果
isDirectory(path)
为false,或者其中没有任何文件的名称中包含“part”,那么您希望从该函数返回什么?@TzachZohar包含“part”的文件路径我知道如果有包含“part”的文件路径,那么应该返回什么,但是代码必须返回某些内容(或引发异常)如果没有这样的文件,您希望它返回什么?