Databricks中如何使用通配符列举ADLS目录下的Parquet文件
问题原因
dbutils.fs.ls 原生不支持通配符匹配,传入带*的路径时,接口会直接把*.parquet当成实际存在的目录名解析,不会做后缀模糊匹配,因此原写法无法生效。
可行方案
方案1:列目录后本地过滤(性能最优,适用于单级目录场景)
直接列目标目录下的所有子项,通过字符串后缀筛选parquet文件即可,无额外依赖:
# 路径末尾建议加/,明确指向目标目录 all_items = dbutils.fs.ls("abfss://path/to/raw/files/") # 筛选后缀为.parquet的文件项 parquet_files = [f for f in all_items if f.path.endswith(".parquet")]
方案2:递归遍历(适用于查找多级子目录下parquet的场景)
如果目标目录下存在多层子文件夹,需要递归遍历所有层级筛选parquet,可以通过自定义函数实现:
def list_all_parquet(base_path): parquet_list = [] for item in dbutils.fs.ls(base_path): if item.path.endswith(".parquet"): parquet_list.append(item) # 遇到子目录则递归遍历 elif item.isDir(): parquet_list.extend(list_all_parquet(item.path)) return parquet_list # 调用方法获取所有层级的parquet文件 all_parquet_files = list_all_parquet("abfss://path/to/raw/files/")
方案3:借助Spark原生通配符能力(写法最简洁)
Spark本身的文件读取接口原生支持通配符匹配,可以直接获取所有匹配路径的parquet文件:
# 匹配当前目录下所有parquet parquet_file_paths = spark.read.parquet("abfss://path/to/raw/files/*.parquet").inputFiles() # 如果要匹配所有子目录下的parquet,把通配符改成**/*.parquet即可 # parquet_file_paths = spark.read.parquet("abfss://path/to/raw/files/**/*.parquet").inputFiles()
注意:该方法会加载parquet文件的元数据,如果目录下文件量级极大,性能会比前两种直接遍历文件系统的方案稍差。
内容的提问来源于stack exchange,提问作者user19930511
相关产品推荐
相关产品推荐

