如何使用 PySpark 计算 ADLS 中的目录大小?

Cri*_*oGo 3 python apache-spark pyspark databricks azure-databricks

我想计算包含子文件夹和子文件的目录(例如 XYZ)大小。我想要所有文件和 XYZ 内所有内容的总大小。

我可以找到特定路径内的所有文件夹。但我想要所有的尺寸在一起。我也看到

display(dbutils.fs.ls("/mnt/datalake/.../XYZ/.../abc.parquet"))

给我 abc 文件的数据大小。但我想要 XYZ 的完整尺寸。

Eme*_*mer 6

没有像,或那样dbutils.fs.ls的递归功能。因此,你需要迭代自己。这是一个可以为您完成任务的片段。从 Databricks Notebook 运行代码。cpmvrm

from dbutils import FileInfo
from typing import List

root_path = "/mnt/datalake/.../XYZ"

def discover_size(path: str, verbose: bool = True):
  def loop_path(paths: List[FileInfo], accum_size: float):
    if not paths:
      return accum_size
    else:
      head, tail = paths[0], paths[1:]
      if head.size > 0:
        if verbose:
          print(f"{head.path}: {head.size / 1e6} MB")
        accum_size += head.size / 1e6
        return loop_path(tail, accum_size)
      else:
        extended_tail = dbutils.fs.ls(head.path) + tail
        return loop_path(extended_tail, accum_size)

  return loop_path(dbutils.fs.ls(path), 0.0)

discover_size(root_path, verbose=True)  # Total size in megabytes at the end

Run Code Online (Sandbox Code Playgroud)

如果该位置安装在 dbfs 中。然后你可以使用该du -h方法(尚未测试)。如果您在笔记本中,请使用以下命令创建一个新单元格:

%sh
du -h /mnt/datalake/.../XYZ
Run Code Online (Sandbox Code Playgroud)

  • `ModuleNotFoundError:没有名为“dbutils”的模块` (2认同)