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程序中执行这些目录和文件的操作怎么办?其实操作系统提供的命令只是简单地调用了操 ...
随机推荐
- WebStorm编辑器
Webstorm的安装和免费使用 IntelliJ IDEA 注册码 (webstorm注册码):http://idea.lanyus.com/ (已经不能获取注册码了,之前的注册码可以重复使用) 安 ...
- js检查判断设备
js检查判断设备 var navigatorType = {}; var u=navigator.userAgent; navigatorType.IsIE= u.indexOf('Trident') ...
- mongo分组查询(转)
1. 多字段分组 {"$group":{"_id": {"state": "$state", "city&qu ...
- Mysql中设置默认时间为系统当前时间
Mysql中设置默认时间为系统当前时间 数据库设计时会遇到的一种情况:将系统当前时间设成默认值存储 数据库设计编码: CREATE TABLE `test` ( `name` varchar(50) ...
- shell cat 合并文件,合并数据库sql文件
> 覆盖写入 >> append模式写入 ###################################################################合并数 ...
- python_way ,day22 tonardo,jsonp
python_way day22 1.tonardo 2.cookie 3.api认证 一.tonardo: a.tonardo 初识 #!/usr/bin/env python3# Created ...
- WPF 3D
参考MSDN内容:http://msdn.microsoft.com/zh-cn/library/ms747437(v=vs.110).aspx 概述 WPF使用Viewport3D元素,将三维场景显 ...
- .net 委托 +lamda表达式
1.委托与类同级 想当于定义了一个类型 如 delegate int Sum(int a, int b);// 在声明类之前声明 2.这里可以在类里写个函数 public int sumAB(int ...
- Redis数据结构之整数集合-intset
当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis会使用整数集合(intset)来存储集合元素. intset是紧凑的数组结构,同时支持16位.32位和64位整数. 结构 struc ...
- 【洛谷】P1349广义斐波那契
题目链接:https://www.luogu.org/problemnew/show/P1349 题意:现在定义fib数列为 an = p * an-1 + q * an-2求第n项%m的答案. 题解 ...