首页 > 解决方案 > 从 Azure Databricks 笔记本连接到 HDFS 位置以获取文件编号和大小

问题描述

我正在尝试从 databricks 笔记本连接到 hdfs 位置以获取文件详细信息。

下面是我试图获得相同的代码

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

我得到了大小为0的结果。只有文件夹审计的细节,而不是它的任何子文件夹。 在此处输入图像描述

audit 文件夹还有 5 个子文件夹,其中包含文件。我想获取每个子文件夹中的文件数以及这 5 个子文件夹的总大小。

我在scala中尝试了dbutils,但它没有任何功能来获取文件数量或文件大小。

  1. 有什么方法可以从 databricks 笔记本中获取 hdfs 中文件夹和子文件夹的大小?
  2. 有没有办法从databricks笔记本中获取hdfs中文件夹和子文件夹中的文件数量?

在此处输入图像描述

标签: scalahadoophdfsdatabricksazure-databricks

解决方案


没有简单的方法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)
}

我希望这有帮助


推荐阅读