You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 10:35:22