无法从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
相关产品推荐
相关产品推荐

