1. 递归读取文件名

1.1 递归实现读取文件名(scala + listFiles)

/**
* 实现:listFiles方法
* 迭代列出文件夹下的文件,只能列出文件
* 通过fs的listFiles方法可以自动实现递归(自带递归)列出文件类型
* 第一个参数是服务器路径,第二个参数是否递归
* @param srcPath
*/
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

HDFS API 操作实例(二) 目录操作的更多相关文章

  1. linux文件操作篇 (四) 目录操作

    #include <sys/stat.h>#include <unistd.h>#include <dirent.h> //创建文件夹 路径 掩码 int mkdi ...

  2. Selenium常用操作汇总二——如何操作select下拉框

    下面我们来看一下selenium webdriver是如何来处理select下拉框的,以http://passport.51.com/reg2.5p这个页面为例.这个页面中有4个下拉框,下面演示4种选 ...

  3. Selenium常用操作汇总二——如何操作cookies(转)

    Web 测试中我们经常会接触到Cookies,一个Cookies主要属性有”所在域.name.value.有效日期和路径",下面来讲一下怎么操作Cookies. import java.ut ...

  4. Python学习笔记(二十五)操作文件和目录

    摘抄:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014319253241 ...

  5. Python之IO编程——文件读写、StringIO/BytesIO、操作文件和目录、序列化

    IO编程 IO在计算机中指Input/Output,也就是输入和输出.由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘.网络等,就需要IO接口.从 ...

  6. SSISDB2:SSIS工程的操作实例

    SSISDB 系列随笔汇总: SSISDB1:使用SSISDB管理Package SSISDB2:SSIS工程的操作实例 SSISDB3:Package的执行实例 SSISDB4:当前正在运行的Pac ...

  7. IO编程(2)-操作文件和目录

    操作文件和目录 如果我们要操作文件.目录,可以在命令行下面输入操作系统提供的各种命令来完成.比如dir.cp等命令. 如果要在Python程序中执行这些目录和文件的操作怎么办?其实操作系统提供的命令只 ...

  8. os,操作文件和目录

    如果我们要操作文件.目录,可以在命令行下面输入操作系统提供的各种命令来完成.比如dir.cp等命令. 如果要在Python程序中执行这些目录和文件的操作怎么办?其实操作系统提供的命令只是简单地调用了操 ...

  9. python学习笔记 操作文件和目录

    如果我们要操作文件.目录,可以在命令行下面输入操作系统提供的各种命令来完成.比如dir.cp等命令. 如果要在Python程序中执行这些目录和文件的操作怎么办?其实操作系统提供的命令只是简单地调用了操 ...

随机推荐

  1. 深入理解PHP原理之Opcodes(PHP执行代码会经过的4个步骤是什么)

    深入理解PHP原理之Opcodes(PHP执行代码会经过的4个步骤是什么) 一.总结 一句话总结: 1.Scanning(Lexing) ,将PHP代码转换为语言片段(Tokens) 2.Parsin ...

  2. java做题笔记

    java做题笔记 1. 初始化过程是这样的: 1.首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化: 2.然后,初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序 ...

  3. appium 定位弹出框时报错

    今天在做APP自动化时,发现定位弹出框无法定位,无奈,百度去找.发现了一篇不错的博客,故转载过来,供大家参考.后续会验证这个方法的可行性. 本博客转自:http://blog.csdn.net/qq7 ...

  4. linux 查看cpu,memory

    https://www.cnblogs.com/ctypyb2002/p/9792951.html

  5. TLS/SSL 协议 - Server Certificate

    Server Certificate 典型的Certificate消息用于携带服务器X.509证书链.证书链是以ASN.1 DER编码的一系列证书,一个接着一个组合而成.主证书必须第一个发送,中间证书 ...

  6. 调试口:JTAG与SW-Debug Port

  7. 拾遗:Go 单元测试

    概念 回归测试:是指修改了旧代码之后,重新进行测试,以确保修改没有引入新的错误或导致其它代码产生错误: 单元测试:是指对软件中的最小可测试单元(单个函数或类)进行检查和验证 Test-Driven D ...

  8. JMeter轻松实现大数据量AI图像识别接口测试

    ****************************************************************************** 本文主要介绍利用Jmeter进行AI图像识 ...

  9. VC++ 2010 创建高级Ribbon界面详解(3)

    3.工具栏 在传统的菜单式界面中,工具栏作为菜单的有益补充,被广泛使用.我们通过将一些常用命令放置到工具栏上,可以让用户直观而快速地访问到常用功能,提高了效率.在Ribbon界面中,工具栏得到了进一步 ...

  10. Mysql 命令行下建立存储过程

    建立存储过程的sql如下: CREATE PROCEDURE  proc_variable () BEGIN DECLARE dec_var_ VARCHAR(100); DECLARE rep_nu ...