Scala操作HDFS

13 篇文章 0 订阅
3 篇文章 0 订阅

Scala操作HDFS
基本的HDFS操作包括:获取文件系统、检查文件是否存在、列举当前目录下的所有文件路径、列举当前目录下的所有文件名称、删除当前路径、创建新的路径

import org.apache.hadoop.conf
import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.{FileStatus, FileSystem, Path}
import org.apache.spark.{SparkConf, SparkContext}

object MyHDFSUtils {
  def main(args: Array[String]): Unit = {

    val sparkConf = new SparkConf().setAppName("MyHDFSUtils")
    val sc = new SparkContext(sparkConf)
    val path = args(0)
    println(listDirPath(sc, path).mkString("\n"))
  }

  /**
    * 获得HDFS文件系统
    *
    * @param sc       SparkContext
    * @param filePath 文件路径 (String)
    * @return
    */
  private def getFileSystem(sc: SparkContext, filePath: String): FileSystem = {
    new Path(filePath).getFileSystem(new Configuration())
  }


  /**
    * 判断文件是否存在
    *
    * @param sc       SparkContext
    * @param filePath 文件路径 (String)
    * @return
    */
  def existsFile(sc: SparkContext, filePath: String): Boolean = {
    getFileSystem(sc, filePath)
      .exists(new Path(filePath))
  }


  /**
    * 获取目录大小
    *
    * @param sc       SparkContext
    * @param filePath 文件路径 (String)
    * @return
    */
  def getDirSize(sc: SparkContext, filePath: String): Long = {
    val fs: FileSystem = getFileSystem(sc, filePath)
    fs.getContentSummary(new Path(filePath)).getSpaceConsumed
  }

  /**
    * 列出目录下文件绝对路径
    *
    * @param sc       SparkContext
    * @param filePath 文件路径 (String)
    * @return
    */
  def listDirPath(sc: SparkContext, filePath: String): Array[String] = {
    val fs = getFileSystem(sc, filePath)
    val fileStatus: Array[FileStatus] = fs.listStatus(new Path(filePath))
    fileStatus.map(
      status => {
        status.getPath.toString
      }
    )
  }

  /**
    * 列出目录下所有文件或者目录名
    *
    * @param sc
    * @param filePath
    * @return
    */
  def listDirNames(sc: SparkContext, filePath: String): Array[String] = {
    val fs = getFileSystem(sc, filePath)
    val fileStatus: Array[FileStatus] = fs.listStatus(new Path(filePath))
    fileStatus.map(
      status => {
        status.getPath.getName
      }
    )
  }

  /**
    * 删除HDFS路径
    *
    * @param filePath  文件或者目录路径
    * @param recursive 是否递归删除
    * @return
    */
  def deleteHDFSPath(filePath: String, recursive: Boolean = true): Boolean = {
    var flag = true
    val path = new Path(filePath)
    val fs = FileSystem.get(path.toUri, new Configuration())
    if (fs.exists(path)) {
      flag = fs.delete(path, recursive)
    }
    flag
  }

  /**
    * 创建HDFS目录,如果已存在就不创建
    *
    * @param filePath
    * @return
    */
  def makeHDFSDirs(filePath: String): Boolean = {
    var flag: Boolean = true
    val path = new Path(filePath)
    val fs = FileSystem.get(path.toUri, new conf.Configuration())
    if (!fs.exists(path)) {
      flag = fs.mkdirs(path)
    }
    flag
  }
}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值