HDFS API 操作实例(二) 目录操作
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 操作实例(二) 目录操作的更多相关文章
- linux文件操作篇 (四) 目录操作
#include <sys/stat.h>#include <unistd.h>#include <dirent.h> //创建文件夹 路径 掩码 int mkdi ...
- Selenium常用操作汇总二——如何操作select下拉框
下面我们来看一下selenium webdriver是如何来处理select下拉框的,以http://passport.51.com/reg2.5p这个页面为例.这个页面中有4个下拉框,下面演示4种选 ...
- Selenium常用操作汇总二——如何操作cookies(转)
Web 测试中我们经常会接触到Cookies,一个Cookies主要属性有”所在域.name.value.有效日期和路径",下面来讲一下怎么操作Cookies. import java.ut ...
- Python学习笔记(二十五)操作文件和目录
摘抄:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014319253241 ...
- Python之IO编程——文件读写、StringIO/BytesIO、操作文件和目录、序列化
IO编程 IO在计算机中指Input/Output,也就是输入和输出.由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘.网络等,就需要IO接口.从 ...
- SSISDB2:SSIS工程的操作实例
SSISDB 系列随笔汇总: SSISDB1:使用SSISDB管理Package SSISDB2:SSIS工程的操作实例 SSISDB3:Package的执行实例 SSISDB4:当前正在运行的Pac ...
- IO编程(2)-操作文件和目录
操作文件和目录 如果我们要操作文件.目录,可以在命令行下面输入操作系统提供的各种命令来完成.比如dir.cp等命令. 如果要在Python程序中执行这些目录和文件的操作怎么办?其实操作系统提供的命令只 ...
- os,操作文件和目录
如果我们要操作文件.目录,可以在命令行下面输入操作系统提供的各种命令来完成.比如dir.cp等命令. 如果要在Python程序中执行这些目录和文件的操作怎么办?其实操作系统提供的命令只是简单地调用了操 ...
- python学习笔记 操作文件和目录
如果我们要操作文件.目录,可以在命令行下面输入操作系统提供的各种命令来完成.比如dir.cp等命令. 如果要在Python程序中执行这些目录和文件的操作怎么办?其实操作系统提供的命令只是简单地调用了操 ...
随机推荐
- AcWing 156. 矩阵 (哈希二维转一维查询)打卡
给定一个M行N列的01矩阵(只包含数字0或1的矩阵),再执行Q次询问,每次询问给出一个A行B列的01矩阵,求该矩阵是否在原矩阵中出现过. 输入格式 第一行四个整数M,N,A,B. 接下来一个M行N列的 ...
- jmeter之-用Firefox录制https协议证书问题
录制脚本的时候,比如录制https协议的百度网站 https://www.baidu.com ,所有录制设置均正常,但是在jmeter录制控制器里面就是没有任何录制的请求. 这个时候提示说证书不对 1 ...
- linux:lrzsz安装
Linux中的lrzsc是linux里可代替ftp上传和下载的程序. yum install lrzsc 没有可用软件包 lrzsc. 这时使用 -y即可安装 centos安装:yum -y inst ...
- 浏览器HTTP协议请求头信息
通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息.客户端向服务器发送一个请求,请求头包含请求的方法.URI.协议版本.以及包含请求修饰符.客户信息和内容的类似于MIME的消息结构 ...
- 什么是NVMe硬盘?
本文摘自:https://zhidao.baidu.com/question/590890784.html NVMe硬盘指的是非易失性内存主机控制器接口规范(Non-Volatile Memory e ...
- JSON 教程首页
JSON教程 JSON或JavaScript对象表示法是一个轻量级的基于文本的开放式标准,旨在为人类可读的数据交换. JSON格式最初是由Douglas Crockford规定,在RFC4627中描述 ...
- strcmp 和 strcoll的区别
功能和strcmp类似,用法也一样. 特别注意:strcoll()会依环境变量LC_COLLATE所指定的文字排列次序来比较s1和s2 字符串. strcmp是根据ASCII来比较2个串的. ...
- Centos 7 技巧
查看系统版本详细信息 lsb_release -a 更改邮件MTA alternatives --config mta
- SpringBoot Controller 中使用多个@RequestBody的正确姿势
最近遇到Controller中需要多个@RequestBody的情况,但是发现并不支持这种写法, 这样导致 1.单个字符串等包装类型都要写一个对象才可以用@RequestBody接收: 2.多个对象需 ...
- 笔记50 Mybatis快速入门(一)
一.Mybatis简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis ...