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

Azure Databricks中FileUtils write方法写入DBFS文件失败如何解决

问题根因
  • org.apache.commons.io.FileUtils 是本地文件系统工具类,无法识别dbfs:/分布式存储协议前缀,传入dbfs:/data.xml路径时,文件实际会写入驱动节点本地磁盘的./dbfs:/目录下,不会同步到DBFS,因此你用dbutils.fs.ls("dbfs:/")无法查询到该文件。
  • 同实例下另一个Notebook运行正常的原因是其使用无协议前缀的相对路径,文件直接写入驱动节点本地磁盘,后续如果用本地文件API读取自然不会报错,没有用到DBFS所以不会暴露问题。
解决方法

根据你的使用场景可以选择以下任意一种方案:

方案1:写入DBFS供全集群访问

方法A:通过DBFS本地挂载点写入

Azure Databricks默认将DBFS挂载到驱动节点的/dbfs目录下,替换路径前缀即可:

val xml: String = Controller.requestTo(url)
val bytes: Array[Byte] = xml.getBytes

// 走本地挂载路径写入DBFS
val localMountPath: String = "/dbfs/data.xml"
val file: File = new File(localMountPath)
FileUtils.writeByteArrayToFile(file, bytes)

// Spark直接读取对应DBFS路径即可
val df = spark.read.format("com.databricks.spark.xml")
                   .option("rowTag", "generic:Obs")
                   .load("dbfs:/data.xml")
df.show

file.delete()

方法B:直接用DBFS原生API写入

不需要依赖本地文件工具类,兼容性更强:

val xml: String = Controller.requestTo(url)
val bytes: Array[Byte] = xml.getBytes
val path: String = "dbfs:/data.xml"

// 直接用dbutils写入DBFS
dbutils.fs.put(path, new String(bytes), overwrite = true)

val df = spark.read.format("com.databricks.spark.xml")
                   .option("rowTag", "generic:Obs")
                   .load(path)
df.show

dbutils.fs.rm(path)

方案2:仅驱动端临时使用不需要同步到DBFS

直接使用本地路径+file://协议读取即可,仅适合小文件单节点处理场景:

val xml: String = Controller.requestTo(url)
val bytes: Array[Byte] = xml.getBytes

// 写入驱动本地临时目录
val localPath: String = "/tmp/data.xml"
val file: File = new File(localPath)
FileUtils.writeByteArrayToFile(file, bytes)

// 用file://协议指定读取驱动本地文件
val df = spark.read.format("com.databricks.spark.xml")
                   .option("rowTag", "generic:Obs")
                   .load(s"file://$localPath")
df.show

file.delete()

内容的提问来源于stack exchange,提问作者Karzyfox

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:45:09