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

如何在Databricks中用PySpark读取ADLS Gen2文件共享的CSV文件

解决ADLS Gen2文件共享CSV读取问题

你的问题根源在于:spark.sparkContext.addFile只会把文件下载到Driver节点的本地磁盘,但当你用spark.read.load("file://...")时,Spark会尝试在每个Executor节点的本地磁盘查找该文件——而Executor节点并没有这个文件,所以抛出路径不存在的错误。

下面给你三种可行的解决方案,按推荐程度排序:

方案1:直接用SAS URL读取CSV(推荐)

Spark的CSV数据源原生支持读取带SAS认证的ADLS Gen2文件共享URL,不需要将文件下载到本地。直接用你的SAS URL作为读取路径即可:

# 替换成你的SAS URL
sas_url = "https://somedatalakename.file.core.windows.net/file_share_name/Data_20200330_1030.csv?sv=yyyy-mm-dd&si=somename&sr=s&sig=somerandomsignature%3D"

call_df = spark.read.format("csv") \
    .option("header", "true") \
    .load(sas_url)

这种方式完全利用Spark的分布式读取能力,适合大文件和生产环境。

方案2:挂载文件共享到Databricks

如果需要频繁访问这个文件共享,建议将其挂载到Databricks的文件系统中,操作和挂载Blob容器类似。挂载后可以像访问本地路径一样读取文件:

步骤1:挂载文件共享

dbutils.fs.mount(
  source = "wasbs://file_share_name@somedatalakename.file.core.windows.net/",
  mount_point = "/mnt/my_file_share",
  extra_configs = {
    "fs.azure.sas.file_share_name.somedatalakename.file.core.windows.net": "你的SAS令牌(注意去掉开头的?)"
  }
)

注意:SAS令牌需要去掉开头的?符号,只保留sv=...&si=...&sr=...&sig=...部分。

步骤2:读取挂载路径下的CSV

file_path = f"/mnt/my_file_share/Data_{date_str}_1030.csv"
call_df = spark.read.format("csv") \
    .option("header", "true") \
    .load(file_path)

挂载后路径更简洁,而且可以重复使用,适合长期使用的文件共享。

方案3:仅适用于小文件——通过Driver本地读取再转Spark DataFrame

如果你的CSV文件很小(不会超过Driver节点内存),可以先在Driver节点读取本地文件(addFile下载的文件),再转成Spark DataFrame:

from pyspark import SparkFiles
import pandas as pd

spark.sparkContext.addFile(uri)
# 获取Driver本地的文件路径
local_file_path = SparkFiles.get(f"Data_{date_str}_1030.csv")

# 先用Pandas读取本地文件
pandas_df = pd.read_csv(local_file_path, header=True)
# 转成Spark DataFrame
call_df = spark.createDataFrame(pandas_df)

这种方法不适合大文件,因为所有数据都会加载到Driver节点内存,无法利用Spark的分布式计算能力。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 07:43:12