无法通过Databricks FUSE挂载路径访问DBFS文件的技术求助
解决Databricks中文件访问的路径混淆问题
兄弟我太懂这种摸不着头脑的情况了——明明dbutils.fs.head能正常读到文件,换pandas或者其他方式就报错,核心原因其实是你混淆了DBFS(Databricks文件系统)和集群节点本地文件系统的路径规则!
为什么会出错?
dbutils.fs系列命令直接操作的是Databricks专属的DBFS,它的路径(比如/FileStore/tables/flights_small.csv)是DBFS的逻辑路径。但pandas、Python原生文件操作这类工具,默认访问的是运行笔记本的集群节点的本地文件系统,这俩完全是两个独立的存储区域,所以直接用DBFS路径给pandas读,它当然找不到文件啦!
给你三个靠谱的解决方法:
方法一:用DBFS的本地挂载路径访问
Databricks默认会把整个DBFS挂载到集群节点的/dbfs目录下,你只需要在原来的DBFS路径前加上/dbfs,pandas就能顺利找到文件了:
import pandas as pd # 把DBFS路径转成本地挂载路径 df = pd.read_csv('/dbfs/FileStore/tables/flights_small.csv')
方法二:用Spark API读取后转pandas DataFrame
既然是在Databricks环境里,更推荐用原生的Spark来读取文件,再转成pandas格式,这样完全不用纠结路径问题:
from pyspark.sql import SparkSession spark = SparkSession.builder.getOrCreate() # 注意根据你的文件情况调整参数:header=True表示文件有表头,inferSchema=True自动推断列类型 spark_df = spark.read.csv('/FileStore/tables/flights_small.csv', header=True, inferSchema=True) # 转成pandas DataFrame pandas_df = spark_df.toPandas()
方法三:复制文件到本地临时路径(不推荐,仅作补充)
如果一定要用本地文件路径的方式,也可以用dbutils把DBFS里的文件复制到节点本地的临时目录:
# 把DBFS文件复制到本地/tmp目录 dbutils.fs.cp('/FileStore/tables/flights_small.csv', 'file:/tmp/flights_small.csv') # 用pandas读取本地临时文件 df = pd.read_csv('/tmp/flights_small.csv') # 用完可以删掉临时文件避免占空间 dbutils.fs.rm('file:/tmp/flights_small.csv')
额外排查点
如果用了上面的方法还是报错,建议先跑一下dbutils.fs.ls('/FileStore/tables/')看看实际的文件名——有时候上传文件后,Databricks会自动给文件名加一串后缀(比如flights_small.csv_202405201234),这时候你用原来的文件名当然找不到啦!
内容的提问来源于stack exchange,提问作者Probhakar Sarkar
相关产品推荐
相关产品推荐

