def listFullFileNames(srcPath: String): List[String] =
{
val buffer
=
new
ArrayBuffer[String]
try
{
val iterator: RemoteIterator[LocatedFileStatus]
= fs.listFiles(
new
Path(srcPath),
true
)
while
(iterator.hasNext) {
val fileStatus
=
iterator.next()
buffer.append(fileStatus.getPath.getName)
}
finally
{
this
.closeFS(fs)
buffer.toList
1.2 递归实现读取文件名(scala + listStatus)
* 通过fs的listStatus方法可以自动实现递归(自带递归)列出文件类型
* @param srcPath 目录
* @param buffer 全局的 ArrayBuffer
* @return
*/
val buffer = new ArrayBuffer[String]()
def listFullFileNames(srcPath: String, buffer: ArrayBuffer[String]): List[String]
=
{
val fileStatuses: Array[FileStatus]
= fs.listStatus(
new
Path(srcPath))
for
(fileStatus <-
fileStatuses) {
//
判断当前迭代对象是否是目录
if
(fileStatus.isDirectory) {
listFullFileNames(fileStatus.getPath.toString, buffer)
}
else
{
buffer.append(fileStatus.getPath.getName)
buffer.toList
注意:使用了全局buffer,以至于递归收集文件数目
1.3 列出某个目录读取文件名(scala)
/** 列出具体路径下的所有文件名称 **/
def listFilesNames(finalPath: String): List[String] = {
val listStatus = try {
fs.listStatus(new Path(finalPath)).map(_.getPath.getName).toList
} catch {
case e: Exception => Nil
listStatus
2. 获取文件状态
2.1 HDFS文件的属性获取
def readFileContent(path: String) = {
val conf: Configuration = new Configuration()
val fs: FileSystem = FileSystem.newInstance(conf)
val fileStatus: Array[FileStatus] = fs.listStatus(new Path(path))
for (fileStatue <- fileStatus) {
println(
s"""
| 是否为目录: ${fileStatue.isDirectory}
| 是否为文件: ${fileStatue.isFile}
| 该文件上次访问时间:${fileStatue.getAccessTime}
| 文件块大小: ${fileStatue.getBlockSize}
| 文件所属组: ${fileStatue.getGroup}
| 文件长度:${fileStatue.getLen}
| 文件最后修改时间:${fileStatue.getModificationTime}
| 文件所有者:${fileStatue.getOwner}
| 文件的路径:${fileStatue.getPath}
| 文件的父路径:${fileStatue.getPath.getParent}
| 文件的名称:${fileStatue.getPath.getName}
| 文件的权限:${fileStatue.getPermission}
| 文件副本数:${fileStatue.getReplication}
| ${fileStatue.getSymlink}
""".stripMargin)
2.2 正则表达式获取文件状态
* 正则获取文件信息
def readStatusGlobStatus() = {
val conf: Configuration = new Configuration()
// val fs: FileSystem = FileSystem.newInstance(conf)
val fs = FileSystem.get(new URI("hdfs://192.xxx.xxx.xxx:9000"), conf, "master")
val path = new Path("/user/compass/*/*") // 路径正则表达式
val fileStatus: Array[FileStatus] = fs.globStatus(path) // 文件名数组
for (fileStatue <- fileStatus) {
println(
s"""
| 文件的名称:${fileStatue.getPath.getName}
| 文件的路径:${fileStatue.getPath}
""".stripMargin)
2.3 正则表达式过滤文件
* 过滤文件信息
* 过滤出包含compass的路径
def readStatusFilterGlobStatus() = {
val conf: Configuration = new Configuration()
// val fs: FileSystem = FileSystem.newInstance(conf)
val fs = FileSystem.get(new URI("hdfs://192.xxx.xxx.xxx:9000"), conf, "master")
val path = new Path("/user/compass/*/*") // 路径正则表达式
val fileGlobStatuses = fs.globStatus(path, new PathFilter {
override def accept(path: Path): Boolean = {
val contidion: String = "compass"
path.toString.contains(contidion)
注:globStatus 很灵活,内部甚至可以写一些正则表达式,有时候在处理大数据的预处理的时候可能很有效
参考:https://www.cnblogs.com/yinzhengjie/p/9094087.html
我不生产知识 我只是知识的搬运工