如何在Databricks中压缩两个文件?解决压缩文件无法查看问题
在Databricks中压缩文件的最优方法及问题排查
原代码的问题分析
- 路径重复错误:你写的
/dbfs/dbfs/tmp/folder1/是无效路径,DBFS的本地挂载路径本身就是/dbfs/,正确路径应为/dbfs/tmp/folder1/test1.parquet。 - 输出位置错误:直接指定
myzip.zip会将压缩文件生成在Driver节点的本地文件系统,而非DBFS路径下,所以你在目标DBFS文件夹中找不到它。
修正后的基础压缩方法(适合小文件)
如果文件体积不大,单节点即可处理,可使用以下两种方式:
方式1:修正zipfile代码
import zipfile # 修正路径,移除重复的/dbfs/前缀 file_paths = ['/dbfs/tmp/folder1/test1.parquet', '/dbfs/tmp/folder1/test2.parquet'] # 指定压缩文件的DBFS全路径 zip_name = '/dbfs/tmp/folder1/myzip.zip' # 使用with语句自动管理文件句柄,添加压缩参数实现真正压缩 with zipfile.ZipFile(zip_name, "w", zipfile.ZIP_DEFLATED) as zip_file: for file in file_paths: # 可选:设置压缩包内的文件名称,避免带完整路径 zip_file.write(file, arcname=file.split('/')[-1])
方式2:使用Shell命令(更简洁)
直接通过Databricks的%sh魔法命令调用Linux原生压缩工具,效率更高:
%sh cd /dbfs/tmp/folder1 zip myzip.zip test1.parquet test2.parquet
分布式大文件压缩方案(适合大体积/多分区文件)
如果文件过大或为Spark生成的分布式多分区文件,单节点处理易出现内存瓶颈,推荐用Spark原生的zip格式输出:
# 读取目标parquet文件 df = spark.read.parquet('/tmp/folder1/test1.parquet', '/tmp/folder1/test2.parquet') # 合并为单个文件后保存为zip格式 df.coalesce(1).write.format("zip").save("/tmp/folder1/myzip_temp") # 移动生成的zip文件到指定位置并清理临时目录 dbutils.fs.mv( '/tmp/folder1/myzip_temp/part-00000-*.zip', '/tmp/folder1/myzip_spark.zip' ) dbutils.fs.rm('/tmp/folder1/myzip_temp', recurse=True)
方法选择总结
- 小文件优先用Shell命令或修正后的
zipfile代码,简单直接; - 大文件/分布式文件用Spark的zip格式输出,避免单节点资源限制。
内容的提问来源于stack exchange,提问作者data en
相关产品推荐
相关产品推荐

