打印(获取)HDFS路径下所有的文件名(包括子目录下的)
我的原创地址:https://dongkelun.com/2018/11/20/getAllHDFSFileNames/
前言
自己有个需求,如题,需要获取HDFS路径下所有的文件名,然后根据文件名用Spark进行后续操作。想了一下用Spark好像不太容易获取到,还要递归的去获取子目录下的文件名,于是查了一下,最后用Hadoop的API搞定,这里记录下,方便以后会用到。
1、数据
测试路径:/tmp/dkl,全路径名hdfs://ambari.master.com:8020/tmp/dkl
用hadoop的命令查看一下,该路径下都有哪些文件和文件夹
hadoop fs -ls /tmp/dkl
附图:
2、完整代码
不多做解释了,直接看代码和结果吧(稍微封装了一下,有其它需求可以参考改写)
package com.dkl.leanring.spark.hdfs import java.net.URI; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileUtil; import scala.collection.mutable.ArrayBuffer /** * 主要目的是打印某个hdfs目录下所有的文件名,包括子目录下的 * 其他的方法只是顺带示例,以便有其它需求可以参照改写 */ object FilesList { def main(args: Array[String]): Unit = { val path = "hdfs://ambari.master.com:8020/tmp/dkl" println("打印所有的文件名,包括子目录") listAllFiles(path) println("打印一级文件名") listFiles(path) println("打印一级目录名") listDirs(path) println("打印一级文件名和目录名") listFilesAndDirs(path) // getAllFiles(path).foreach(println) // getFiles(path).foreach(println) // getDirs(path).foreach(println) } def getHdfs(path: String) = { val conf = new Configuration() FileSystem.get(URI.create(path), conf) } def getFilesAndDirs(path: String): Array[Path] = { val fs = getHdfs(path).listStatus(new Path(path)) FileUtil.stat2Paths(fs) } /**************直接打印************/ /** * 打印所有的文件名,包括子目录 */ def listAllFiles(path: String) { val hdfs = getHdfs(path) val listPath = getFilesAndDirs(path) listPath.foreach(path => { if (hdfs.getFileStatus(path).isFile()) println(path) else { listAllFiles(path.toString()) } }) } /** * 打印一级文件名 */ def listFiles(path: String) { getFilesAndDirs(path).filter(getHdfs(path).getFileStatus(_).isFile()).foreach(println) } /** * 打印一级目录名 */ def listDirs(path: String) { getFilesAndDirs(path).filter(getHdfs(path).getFileStatus(_).isDirectory()).foreach(println) } /** * 打印一级文件名和目录名 */ def listFilesAndDirs(path: String) { getFilesAndDirs(path).foreach(println) } /**************直接打印************/ /**************返回数组************/ def getAllFiles(path: String): ArrayBuffer[Path] = { val arr = ArrayBuffer[Path]() val hdfs = getHdfs(path) val listPath = getFilesAndDirs(path) listPath.foreach(path => { if (hdfs.getFileStatus(path).isFile()) { arr += path } else { arr ++= getAllFiles(path.toString()) } }) arr } def getFiles(path: String): Array[Path] = { getFilesAndDirs(path).filter(getHdfs(path).getFileStatus(_).isFile()) } def getDirs(path: String): Array[Path] = { getFilesAndDirs(path).filter(getHdfs(path).getFileStatus(_).isDirectory()) } /**************返回数组************/ }
3、结果
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
扩展Spark Catalyst,打造自定义的Spark SQL引擎
Apache Spark是大数据处理领域最常用的计算引擎之一,被应用在各种各样的场景中,除了易用的API,稳定高效的处理引擎,可扩展性也是Spark能够得到广泛应用的一个重要原因。Spark中最常见的扩展就是基于DataSource API添加对新数据源的支持,除了Spark内置的HDFS,S3,Kafka等数据源,Parquet,Orc,Avro等数据类型,还有很多第三方的DataSource Plugin使得Spark成为大数据领域可以处理数据源类型最丰富的计算引擎。当然,除了DataSource,Spark还有支持很多其他的扩展点,今天我们要介绍的是Spark SQL Catalyst的扩展点,以及如何通过这些扩展点实现一些有意思的功能,打造自定义的Spark SQL引擎。 在Spark2.2版本中,引入了新的扩展点,使得用户
- 下一篇
面向数据架构的云演变
版权声明:本文为半吊子子全栈工匠(wireless_com,同公众号)原创文章,未经允许不得转载。 https://blog.csdn.net/wireless_com/article/details/84312868 现代数据架构的概念在过去的10多年里发生了巨大的变化,具体可以参见公众号“补天遗石”的《从数据仓库到数据湖——浅谈数据架构演进》一文。 把时钟调回来,回想一下那些有许多限制的遗留数据架构的日子。 存储是昂贵的,并且有相关的硬件成本。 计算经常涉及服务器和更多的硬件投资。 网络是昂贵的,部署只是在场内,专有软件和硬件都锁定在用户所在的所有企业。 这是一个(对许多组织来说仍然是)的世界,在这个世界上,架构只允许对高度结构化数据进行事后分析。 随着移动和传感器等新数据类型的出现,以及机器学习和数据科学等新的分析出现,这些遗留架构中的弱点就会暴露无遗。 再加上云计算的出现,我们将迎来一场完美的风暴。 许多相互关联的因素打乱了遗留的数据体系结构时代。 储存变得更加便宜,像 Apache Hadoop 这样的软件成为了中心舞台。 计算也走软件路线,我们看到了边缘计算的开始。 网络变...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8安装Docker,最新的服务器搭配容器使用
- Hadoop3单机部署,实现最简伪集群
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8编译安装MySQL8.0.19
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker快速安装Oracle11G,搭建oracle11g学习环境