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
相关产品推荐
相关产品推荐

