val fsds = dbutils.fs.ls("/mnt/datalake/.../XYZ/.../abc.parquet").toDF
fsds.createOrReplaceTempView("filesList")
display(spark.sql("select COUNT(name) as NoOfRows, SUM(size) as sizeInBytes from fileListPROD"))
# from dbutils import FileInfo # Not required in databricks
# from dbruntime.dbutils import FileInfo # may work for some people
def get_size_of_path(path):
return sum([file.size for file in get_all_files_in_path(path)])
def get_all_files_in_path(path, verbose=False):
nodes_new = []
nodes_new = dbutils.fs.ls(path)
files = []
while len(nodes_new) > 0:
current_nodes = nodes_new
nodes_new = []
for node in current_nodes:
if verbose:
print(f"Processing {node.path}")
children = dbutils.fs.ls(node.path)
for child in children:
if child.size == 0 and child.path != node.path:
nodes_new.append(child)
elif child.path != node.path:
files.append(child)
return files
path = "s3://some/path/"
print(f"Size of {path} in gb: {get_size_of_path(path) / 1024 / 1024 / 1024}")
5条答案
按热度按时间vc6uscn91#
dbutils.fs.ls
不像cp
、mv
或rm
那样具有递归功能。因此,您需要自己迭代。下面是一个代码片段,它将为您完成此任务。从数据块笔记本运行代码。如果该位置是在dbfs中挂载的。那么您可以使用
du -h
方法(尚未测试)。如果您在笔记本中,请使用以下内容创建一个新单元:epggiuax2#
@Emer的答案很好,但是可以很快找到
RecursionError: maximum recursion depth exceeded
,因为它对每个文件都进行递归(如果有X个文件,则会有X个叠瓦递归)。以下是仅针对文件夹的递归:
pobjuy323#
尝试使用dbutils ls命令,获取 Dataframe 中的文件列表,然后对size列使用聚合函数SUM()进行查询:
qlckcl4x4#
爱死answer by Emer了!
少量添加:
如果你遇见
“模块未找到错误:没有名为'dbutils'的模块“
试试这个
from dbruntime.dbutils
而不是from dbutils
,它对我很有效!ldioqlga5#
对于那些仍在用@robin loce的方法达到递归极限的人,这里有一个纯粹的迭代答案: