在Databricks的DBFS中压缩CSV为ZIP遇错误,求解决方案
解决Databricks中压缩ADLS CSV文件报错的问题
错误原因
直接通过/dbfs路径使用zipfile写入Azure Data Lake Storage(ADLS)会触发OSError: [Errno 95] Operation not supported,因为DBFS的FUSE挂载层对对象存储的随机写入操作支持有限,而zipfile的写入逻辑依赖本地文件系统的随机访问能力,ADLS作为对象存储不支持这类操作。
可行解决方法
方法一:本地临时目录中转压缩(适合大文件)
先将CSV文件复制到Databricks节点的本地临时目录(/tmp),完成压缩后再上传回ADLS,规避对象存储的操作限制:
import zipfile import shutil import os # 定义路径 dbfs_csv_path = '/dbfs/mnt/<path>.csv' dbfs_zip_path = '/dbfs/mnt/<path>.zip' local_csv = '/tmp/temp_csv.csv' local_zip = '/tmp/compressed.zip' # 复制ADLS文件到本地临时目录 shutil.copy(dbfs_csv_path, local_csv) # 压缩本地文件,指定压缩算法 with zipfile.ZipFile(local_zip, 'w', zipfile.ZIP_DEFLATED) as zip_obj: # arcname参数设置压缩包内的文件名,避免带本地路径 zip_obj.write(local_csv, arcname='data.csv') # 将压缩文件上传回ADLS shutil.copy(local_zip, dbfs_zip_path) # 清理本地临时文件 os.remove(local_csv) os.remove(local_zip)
方法二:用Pandas直接生成压缩文件(适合小文件)
利用Pandas的to_csv方法自带的压缩功能,直接读取CSV并写入ZIP文件,无需中转:
import pandas as pd csv_path = '/dbfs/mnt/<path>.csv' zip_path = '/dbfs/mnt/<path>.zip' # 读取CSV并写入压缩文件,index=False避免写入索引列 pd.read_csv(csv_path).to_csv(zip_path, compression='zip', index=False)
注意事项
- 本地临时目录(
/tmp)的空间由Databricks节点配置决定,大文件压缩前需确认节点有足够剩余空间 - 确保ADLS挂载点拥有读写权限,避免上传/复制时出现权限错误
内容的提问来源于stack exchange,提问作者Cristian Ispan
相关产品推荐
相关产品推荐

