您现在的位置是:首页 > 文章详情

打印(获取)HDFS路径下所有的文件名(包括子目录下的)

日期:2018-11-20点击:538
版权声明:本文由董可伦首发于https://dongkelun.com,非商业转载请注明作者及原创出处。商业转载请联系作者本人。 https://blog.csdn.net/dkl12/article/details/84312307

我的原创地址: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、结果

原文链接:https://yq.aliyun.com/articles/676174
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章