从azure databricks笔记本连接到hdfs位置以获取文件编号和大小

czfnxgou  于 2021-05-31  发布在  Hadoop
关注(0)|答案(1)|浏览(362)

我正在尝试从databricks笔记本连接到hdfs位置以获取文件详细信息。
下面是我试图获得的代码

%fs ls dbfs:/mnt/<mount>/dev/data/audit/

我得到了大小为0的结果。并且只审核文件夹的详细信息,不审核其任何子文件夹。

审核文件夹还有5个子文件夹,其中包含文件。我想得到每个子文件夹中的文件数和这5个子文件夹的总大小。
我在scala中尝试了下面的dbutils,但它没有任何函数来获取文件数或文件大小。
有没有办法从databricks笔记本中获得hdfs中文件夹和子文件夹的大小?
有没有办法从databricks笔记本中获取hdfs中文件夹和子文件夹中的文件数?

xu3bshqb

xu3bshqb1#

世界上没有简单的方法 dbutils 返回目录的大小或目录中的文件数。但是,可以递归地迭代目录进行计算。
1递归计算的文件数:

import scala.annotation.tailrec
import com.databricks.backend.daemon.dbutils.FileInfo
import com.databricks.dbutils_v1

private lazy val dbutils = dbutils_v1.DBUtilsHolder.dbutils

def numberOfFiles(location: String): Int = {
  @tailrec
  def go(items: List[FileInfo], result: Int): Int = items match {
    case head :: tail =>
      val files = dbutils.fs.ls(head.path)
      val directories = files.filter(_.isDir)
      go(tail ++ directories, result + files.size)
    case _ => result
  }

  go(dbutils.fs.ls(location).toList, 0)
}

2文件夹的总大小

import com.databricks.backend.daemon.dbutils.FileInfo

def sizeOfDirectory(location: String): Long = {
  @tailrec
  def go(items: List[FileInfo], result: Long): Long = items match {
    case head :: tail =>
      val files = dbutils.fs.ls(head.path)
      val directories = files.filter(_.isDir)
      val updated = files.map(_.size).foldLeft(result)(_ + _)
      go(tail ++ directories, updated)
    case _ => result
  }

  go(dbutils.fs.ls(location).toList, 0)
}

我希望这有帮助

相关问题