Json 仅从scala中的HDFS目录获取所需的文件详细信息

Json 仅从scala中的HDFS目录获取所需的文件详细信息,json,scala,apache-spark,hdfs,Json,Scala,Apache Spark,Hdfs,我在Spark Scala中使用org.apache.hadoop.fs包时遇到了一个问题。我只需要从给定目录中获取所需的文件详细信息(文件名、块大小、修改时间)。我尝试使用以下代码 import org.apache.hadoop.conf.Configuration import org.apache.hadoop.fs.{FileStatus, FileSystem, Path} val fs = FileSystem.get(new Configuration()) val dir:

我在Spark Scala中使用org.apache.hadoop.fs包时遇到了一个问题。我只需要从给定目录中获取所需的文件详细信息(文件名、块大小、修改时间)。我尝试使用以下代码

import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.{FileStatus, FileSystem, Path}

val fs = FileSystem.get(new Configuration())
val dir: String = "/env/domain/work/latest_ts"
val input_files = fs.listStatus(new Path(dir))
获取的变量input_files是Array[FileStatus],包含该目录中文件的所有详细信息。在我的Spark代码中,对于以列表[详细信息]形式存在的每个文件,我只需要上述三个参数

case class Details(name: String, size: Double, time: String)
在数组[FileStatus]中,我们将“路径”(文件完整路径)作为字符串,块大小作为长度和修改时间。 我尝试将数组[FileStatus]解析为Json并取出所需的键值对,但我做不到。我还尝试了以下方法,分别创建了三个列表,并将它们压缩成一个元组列表(String、Double、String),但它与list[Details]不匹配,在执行时抛出一个错误

val names = fs.listStatus(new Path(dir)).map(_.getPath().getName).toList
val size = fs.listStatus(new Path(dir)).map(_.getBlockSize.toDouble).toList
val time = fs.listStatus(new Path(dir)).map(_.getModificationTime.toString).toList
val input_tuple = (names zip time zip size) map {case ((n,t),s) => (n,t,s)}

val input_files : List[Details] = input_tuple.asInstanceOf[List[Details]]
我犯的错误是

Exception during processing!
java.lang.ClassCastException: scala.Tuple3 cannot be cast to com.main.Details
有没有人能告诉我,有没有办法从fs中获取所需的参数,或者如何正确地转换元组 请帮忙,提前谢谢


为了转换Json和读取键值对,我使用mkString(“,”)将数组[FileStatus]转换为字符串,并尝试使用Json.parseFull(input_String)进行解析,这引发了一个错误

以下是您可以做的:

import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.{FileStatus, FileSystem, Path}

val fs = FileSystem.get(new Configuration())
val dir: String = "/env/domain/work/latest_ts"
val input_files = fs.listStatus(new Path(dir))

val details  = input_files.map(m => Details(m.getPath.toString, m.getBlockSize, m.getModificationTime.toString)).toList

这将为您提供列表[详细信息]。希望这有帮助

多谢各位。我想试试,我还有一个小问题。是否有在hdfs目录之间复制文件的功能。像~hadoop fs-cp命令一样,我知道fs.rename(源路径、目标路径),但这会在文件夹之间移动文件。非常感谢。