Databricks社区版PySpark读取FTP的CSV文件报路径不存在如何解决
问题原因
SparkFiles.get() 返回的是驱动节点本地磁盘的原生文件路径,不属于DBFS文件系统路径。Databricks环境下,传入不带协议前缀的路径给spark.read.csv()时,Spark会默认给路径拼接dbfs://前缀,按DBFS路径寻址,自然找不到存在本地磁盘上的文件,触发路径不存在报错。
可用解决方案
方案1:指定本地文件协议前缀(适配小文件快速读取)
给获取到的本地路径拼接file://协议头,明确告知Spark该路径属于本地磁盘,不要走DBFS路径解析:
from pyspark import SparkFiles spark.sparkContext.addFile('ftp://USERNAME:PASSWORD@URL/<folder_name>/MyFile.csv') local_file = f"file://{SparkFiles.get('MyFile.csv')}" # 按需配置header、编码、分隔符等CSV读取参数 df = spark.read.csv(path=local_file, header=True)
注意:该方案仅适合GB级以下的小文件,文件是直接下载到驱动节点本地磁盘,大文件使用会导致驱动节点磁盘占满、读取性能极差。
方案2:直接通过FTP路径读取(推荐)
完全跳过addFile下载到本地的步骤,直接把带鉴权的FTP路径传给CSV读取接口,Spark会自动通过Hadoop FTP文件系统拉取数据,支持分布式读取,没有路径识别问题:
ftp_file_path = "ftp://USERNAME:PASSWORD@URL/<folder_name>/MyFile.csv" df = spark.read.csv( path=ftp_file_path, header=True, inferSchema=True )
如果Hostinger分配的FTP服务不是默认21端口,直接在URL中补充端口即可,格式为ftp://USERNAME:PASSWORD@URL:端口号/<folder_name>/MyFile.csv。如果连接时遇到FTP被动模式报错,可以在读取前加配置:spark.conf.set("spark.hadoop.fs.ftp.data.connection.mode", "PASSIVE_LOCAL_DATA_CONNECTION_MODE")。
方案3:转存到DBFS后读取(适配需要反复访问的场景)
如果文件需要多次读取,可以先把下载到本地的文件拷贝到DBFS存储,后续直接读DBFS路径即可,不用重复从FTP拉取:
from pyspark import SparkFiles spark.sparkContext.addFile('ftp://USERNAME:PASSWORD@URL/<folder_name>/MyFile.csv') local_tmp_path = SparkFiles.get("MyFile.csv") # 拷贝本地文件到DBFS目录 dbutils.fs.cp(f"file://{local_tmp_path}", "dbfs:/dataset/MyFile.csv") df = spark.read.csv("dbfs:/dataset/MyFile.csv", header=True)
注意事项
- Databricks环境中所有传给Spark读写接口的路径,必须明确带协议前缀:本地文件用
file://,DBFS文件用dbfs://,外部存储路径带对应存储的协议头,不带前缀的路径默认全部按DBFS路径解析。 - Hostinger的共享主机FTP通常有连接数、单连接传输速度限制,大文件优先先下载到对象存储再挂载到Databricks读取,稳定性更高。
内容的提问来源于stack exchange,提问作者Vijay Motwani
相关产品推荐
相关产品推荐

