scala - 从 Azure Databricks 笔记本连接到 HDFS 位置以获取文件编号和大小
问题描述
我正在尝试从 databricks 笔记本连接到 hdfs 位置以获取文件详细信息。
下面是我试图获得相同的代码
%fs ls dbfs:/mnt/<mount>/dev/data/audit/
我得到了大小为0的结果。只有文件夹审计的细节,而不是它的任何子文件夹。
audit 文件夹还有 5 个子文件夹,其中包含文件。我想获取每个子文件夹中的文件数以及这 5 个子文件夹的总大小。
我在scala中尝试了dbutils,但它没有任何功能来获取文件数量或文件大小。
- 有什么方法可以从 databricks 笔记本中获取 hdfs 中文件夹和子文件夹的大小?
- 有没有办法从databricks笔记本中获取hdfs中文件夹和子文件夹中的文件数量?
解决方案
没有简单的方法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)
}
我希望这有帮助
推荐阅读
- java - JPA中成员实体的继承问题
- android - 如何从 Android APP 中的 Firebase 动态链接 (FDL) 读取查询参数
- python - Python,无法导入烧瓶-restplus
- visual-studio - 插入制表符而不是空格
- c# - C# 序列化 JSON 对象无法映射到 POST 的目标字段
- sql - 如何在没有重复数据的情况下对两个具有连接的表求和?
- c# - 这个 C# 字典初始化如何正确?
- angular - Cordova & Ionic 4 未找到“FBSDKCoreKit/FBSDKCoreKit.h”文件
- flutter - setState() 在 statefulWidget 类中无法识别
- javascript - 什么会导出 JavaScript/Node.JS 文件?