Databricks挂载ADLS后,如何按扩展名过滤加载指定JSON文件?
解决Spark递归读取ADLS中指定扩展名JSON文件的问题
问题原因
开启recursiveFileLookup后,直接在路径中使用**.json通配符无法被Spark正确解析,导致路径不存在报错;而使用**/*会读取所有文件,包含非JSON格式的文件。以下是几种可靠的解决方案:
方法一:使用pathGlobFilter选项(推荐)
利用Spark原生的pathGlobFilter选项,结合recursiveFileLookup实现递归过滤指定扩展名的文件,这是效率最高的方式:
df = spark.read.option("recursiveFileLookup", "true") \ .option("pathGlobFilter", "*.json") \ .json("/mnt/adls_gen/prod/")
pathGlobFilter会仅匹配文件名以.json结尾的文件recursiveFileLookup确保遍历所有子目录- 路径只需指定根目录,无需额外通配符
方法二:递归枚举JSON文件路径再读取
如果需要更灵活的过滤逻辑(比如排除特定子目录),可以用Databricks的文件工具先枚举所有符合条件的JSON文件,再批量读取:
def list_json_files(path): json_paths = [] # 遍历当前路径下的所有项 for item in dbutils.fs.ls(path): if item.isDir(): # 递归处理子目录 json_paths.extend(list_json_files(item.path)) else: # 筛选.json后缀的文件 if item.path.endswith(".json"): json_paths.append(item.path) return json_paths # 获取所有JSON文件路径 target_files = list_json_files("/mnt/adls_gen/prod/") # 读取文件 df = spark.read.json(target_files)
方法三:读取后过滤(不推荐)
这种方式会先读取所有文件,再通过文件名过滤,效率较低,仅作为备选方案:
from pyspark.sql.functions import input_file_name # 读取所有递归文件 df = spark.read.option("recursiveFileLookup", "true") \ .json("/mnt/adls_gen/prod/**/*") # 过滤仅保留来自.json文件的记录 df = df.filter(input_file_name().endswith(".json"))
内容的提问来源于stack exchange,提问作者Sujeet Chaurasia
相关产品推荐
相关产品推荐

