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

