在Databricks中用Python实现ADLS中JSON文件的查找、重命名与移动
Databricks中移动ADLS JSON文件的问题解决
问题根源
在Databricks环境中,挂载的ADLS路径由DBFS(Databricks文件系统)管理,os模块是针对本地文件系统设计的工具,无法完全适配分布式存储的操作逻辑,这就是你用os.listdir和os.rename报错找不到文件的核心原因。同时你的原代码存在逻辑漏洞:os.rename写在循环外部,只会处理循环最后遍历到的JSON文件,若源文件夹有多个JSON文件,会导致遗漏或覆盖。
推荐解决方案:使用dbutils.fs工具
dbutils.fs是Databricks官方提供的文件系统操作工具,完美支持DBFS及挂载的ADLS路径,代码如下:
# 定义源文件夹与目标文件夹路径 source_folder = "/mnt/datalake/raw/Group/CompanyName/API/JSON/Campaign_Tags/" target_folder = "/mnt/datalake/cleansed/Group/CompanyName/API/JSON/Campaign_Tags/" target_filename = "Campaign_Tags.json" # 列出源文件夹下所有文件对象 files = dbutils.fs.ls(source_folder) # 遍历筛选并处理JSON文件 for file in files: # 过滤出非临时的JSON文件(排除_committed、_started这类文件) if file.name.endswith(".json") and not file.name.startswith("_"): # 拼接完整的源路径与目标路径 source_full_path = file.path target_full_path = f"{target_folder.rstrip('/')}/{target_filename}" # 执行移动并重命名操作 dbutils.fs.mv(source_full_path, target_full_path) print(f"文件移动完成: {source_full_path} → {target_full_path}") break # 若仅需处理一个JSON文件,找到后退出循环即可
备选方案:用Spark API处理复杂场景
如果需要更复杂的文件筛选逻辑,可结合Spark API实现:
from pyspark.sql import SparkSession spark = SparkSession.builder.getOrCreate() source_folder = "/mnt/datalake/raw/Group/CompanyName/API/JSON/Campaign_Tags/" target_folder = "/mnt/datalake/cleansed/Group/CompanyName/API/JSON/Campaign_Tags/" target_filename = "Campaign_Tags.json" # 获取源文件夹下所有JSON文件的路径 json_file_paths = spark.read.json(source_folder).inputFiles() # 遍历处理每个符合条件的文件 for path in json_file_paths: filename = path.split("/")[-1] if not filename.startswith("_"): target_path = f"{target_folder.rstrip('/')}/{target_filename}" dbutils.fs.mv(path, target_path) print(f"文件移动完成: {path} → {target_path}") break
注意事项
- 确保你的Databricks集群已配置好ADLS的访问权限(存储密钥或服务主体权限正常)。
- 若源文件夹可能存在多个JSON文件,可根据需求移除
break语句,或者添加额外逻辑处理多文件场景。 - 使用
dbutils.fs.mv时,若目标文件已存在会报错,可提前用dbutils.fs.exists(target_full_path)检查,或添加overwrite=True参数(部分Databricks版本支持)。
内容的提问来源于stack exchange,提问作者Matt Owen
相关产品推荐
相关产品推荐

