Azure Databricks写入Parquet至Data Lake Gen2时路径已存在但无文件报错
解决Azure Databricks写入ADLS时路径已存在但容器无文件的问题
以下是几个针对性的排查和解决方法:
核对挂载点的实际映射关系
先确认dbfs:/mnt/datalakegen212/processed这个挂载点对应的ADLS实际路径,执行命令:dbutils.fs.mounts()查看输出里该挂载点的
source字段,确认是不是你正在检查的那个processed容器——有可能挂载的是其他存储账户的容器,或者路径拼写有误,导致你看的容器和实际写入的容器不是同一个。检查DBFS路径的实际状态
即使ADLS里没文件,DBFS的元数据可能缓存了路径存在的标记。执行命令查看路径内容:dbutils.fs.ls("dbfs:/mnt/datalakegen212/processed")如果返回空列表但仍报错,尝试卸载再重新挂载:
# 卸载挂载点 dbutils.fs.unmount("dbfs:/mnt/datalakegen212/processed") # 替换成你的实际挂载命令重新挂载 dbutils.fs.mount( source = "abfss://processed@[你的存储账户名].dfs.core.windows.net/", mount_point = "/mnt/datalakegen212/processed", extra_configs = {"fs.azure.account.key.[你的存储账户名].dfs.core.windows.net": dbutils.secrets.get(scope="[你的密钥范围]", key="[存储密钥名]")} )调整写入命令的模式参数
默认情况下,Spark写入时如果检测到路径存在就会抛出AnalysisException。你可以在写入时指定mode="overwrite"或mode="append"来绕过这个限制,比如:df.write.mode("overwrite").parquet("dbfs:/mnt/datalakegen212/processed")检查ADLS的软删除/版本控制
如果你的ADLS容器开启了软删除,之前删除的文件可能还在保留期内,导致DBFS识别路径存在。登录Azure门户,进入存储账户→目标容器→「已删除的Blob」,查看是否有processed路径下的残留文件,恢复或彻底删除后再尝试写入。重启Databricks集群
Databricks的元数据缓存偶尔会出现不一致,重启集群后再执行写入操作,大概率能解决这类缓存导致的问题。
内容的提问来源于stack exchange,提问作者Assad Ali
相关产品推荐
相关产品推荐

