Azure Synapse Notebook读取ADLS Gen2中PDF文件失败求助
在Azure Synapse Notebook中读取ADLS Gen2内PDF文件的解决方案
问题背景
- 运行于虚拟网络内的Azure Synapse,通过私有端点访问ADLS Gen2
- 读取CSV文件正常,但使用
PyPDF2/camelot读取PDF时持续报错,包括FileNotFoundError、OSError: [Errno 5]等 - 尝试挂载存储后仍无法读取PDF,仅CSV可正常访问
方法1:将PDF下载到本地临时目录后读取
Synapse的Python环境无法直接通过ABFSS路径或挂载路径用本地文件IO读取二进制文件,需先将文件从ADLS下载到Synapse本地临时存储:
import mssparkutils import PyPDF2 # 定义ADLS上的PDF路径(ABFSS格式) pdf_abfss_path = "abfss://container@accountname.dfs.core.windows.net/file.pdf" # 本地临时存储路径 local_temp_path = "/tmp/file.pdf" # 从ADLS下载文件到本地临时目录 mssparkutils.fs.cp(pdf_abfss_path, f"file:{local_temp_path}", recurse=False) # 以二进制模式读取本地文件 with open(local_temp_path, 'rb') as f: pdf_reader = PyPDF2.PdfReader(f) # 验证读取:打印PDF页数 print(f"PDF页数:{len(pdf_reader.pages)}")
方法2:通过字节流直接读取(无需本地下载)
利用mssparkutils.fs.open获取文件字节流,直接传入PyPDF2处理:
import mssparkutils import PyPDF2 from io import BytesIO # 打开ADLS上的PDF文件,获取字节流 with mssparkutils.fs.open("abfss://container@accountname.dfs.core.windows.net/file.pdf", "rb") as fs_stream: # 将字节流转换为PyPDF2可识别的格式 pdf_stream = BytesIO(fs_stream.read()) pdf_reader = PyPDF2.PdfReader(pdf_stream) # 验证操作:提取第一页文本 first_page_text = pdf_reader.pages[0].extract_text() print(first_page_text)
关键说明
- 路径访问限制原因
- Synapse的Python运行时中,
open()仅支持本地文件系统,PyPDF2等库不直接兼容ABFSS分布式存储协议 - Spark层面的挂载路径(如
/synfs/mount#/TR/)无法被Python本地IO直接识别为可读取的二进制文件路径
- Synapse的Python运行时中,
- 私有端点环境注意事项
- 确认Synapse托管虚拟网络已配置ADLS Gen2私有端点的访问权限
- 检查链接服务是否正确绑定私有端点,无防火墙/NSG规则阻挡流量
内容的提问来源于stack exchange,提问作者Pashket
相关产品推荐
相关产品推荐

