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

无法从ADLSv2访问Zip/Exe文件至Synapse的问题求助

解决Synapse中用Python标准库访问ADLSv2 Zip/Exe文件的问题

错误原因

Python标准库的zipfile模块无法识别ADLSv2的abfss://协议路径,它仅支持本地文件系统或Python原生支持的文件协议(如file://)。你能读取同目录下的CSV/TXT文件,是因为Spark本身集成了对abfss协议的支持,直接通过Spark API读取时会自动处理,但Python标准库不具备这个能力。

解决方案

方案一:将文件下载到节点本地临时目录处理

通过Spark的文件分发API将ADLSv2上的Zip文件下载到Spark节点的临时目录,再用zipfile处理:

import zipfile
from pyspark.sql import SparkSession
from pyspark import SparkFiles

# 定义ADLSv2上的Zip文件路径
zip_abfss_path = "abfss://samplecontainersa@samplesa.dfs.core.windows.net/folder1/sample2.zip"

# 将文件分发到所有Spark节点的临时目录
spark.sparkContext.addFile(zip_abfss_path)
# 获取本地临时路径
local_zip_path = SparkFiles.get("sample2.zip")

# 提取Zip中的图片文件并生成DataFrame
with zipfile.ZipFile(local_zip_path, 'r') as zip_ref:
    file_list = zip_ref.namelist()
    # 筛选图片文件
    image_files = [f for f in file_list if f.lower().endswith(('.jpg', '.jpeg', '.png'))]
    # 读取图片文件名和字节数据
    image_data = [(f, zip_ref.read(f)) for f in image_files]

df = spark.createDataFrame(image_data, ["filename", "image_bytes"])
df.show()

方案二:通过Hadoop FileSystem API直接读取内存处理(无需本地下载)

利用Spark集成的Hadoop文件系统API读取Zip文件内容到内存字节流,再用BytesIO包装后交给zipfile处理:

import zipfile
from io import BytesIO
from pyspark.sql import SparkSession
from py4j.java_gateway import java_import

spark = SparkSession.builder.getOrCreate()
# 导入Hadoop Path类
java_import(spark._jvm, "org.apache.hadoop.fs.Path")
# 获取Hadoop文件系统实例
fs = spark._jvm.org.apache.hadoop.fs.FileSystem.get(spark._jsc.hadoopConfiguration())

zip_path = "abfss://samplecontainersa@samplesa.dfs.core.windows.net/folder1/sample2.zip"
hadoop_path = spark._jvm.Path(zip_path)

# 读取Zip文件内容到字节数组
input_stream = fs.open(hadoop_path)
zip_bytes = input_stream.readAll()
input_stream.close()

# 用BytesIO包装字节数据,让zipfile可以解析
with zipfile.ZipFile(BytesIO(zip_bytes), 'r') as zip_ref:
    file_list = zip_ref.namelist()
    image_files = [f for f in file_list if f.lower().endswith(('.jpg', '.jpeg', '.png'))]
    image_data = [(f, zip_ref.read(f)) for f in image_files]

df = spark.createDataFrame(image_data, ["filename", "image_bytes"])
df.show()

注意事项

  • 确保Synapse Spark集群已配置好ADLSv2的访问权限(如托管标识、服务主体),你能读取CSV文件说明权限基本没问题,若仍有异常可检查权限配置。
  • 若Zip文件体积较大,方案一需考虑节点的磁盘剩余空间,方案二需注意内存占用情况,避免OOM。
  • 访问Exe文件的问题与Zip文件一致,可套用上述两种方案处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 20:25:10