[英]Compress CSV to ZIP in dbfs (databricks file storage)
我正在尝试将位于 azure 数据湖中的 csv 压缩到 zip。 该操作是使用 databricks 中的 python 代码完成的,我在其中创建了一个挂载点以将 dbfs 与 datalake 直接关联。
这是我的代码:
import os
import zipfile
csv_path= '/dbfs/mnt/<path>.csv'
zip_path= '/dbfs/mnt/<path>.zip'
with zipfile.ZipFile(zip_path, 'w') as zip:
zip.write(csv_path) # zipping the file
但我收到了这个错误:
OSError: [Errno 95] Operation not supported
有什么办法吗?
先感谢您。
不,这不可能像你那样做。 主要原因是本地 DBFS API 有限制- 它不支持创建 zip 文件时所需的随机写入。
解决方法如下 - output zip 文件到驱动节点的本地磁盘,然后使用dbutils.fs.mv
将文件移动到 DBFS,如下所示:
import os
import zipfile
csv_path= '/dbfs/mnt/<path>.csv'
zip_path= '/dbfs/mnt/<path>.zip'
local_path = '/tmp/my_file.zip'
with zipfile.ZipFile(local_path, 'w') as zip:
zip.write(csv_path) # zipping the file
dbutils.fs.mv(f"file:{local_path}", zip_path)
复制此内容时,我在下面遇到了相同的错误。
但是我可以通过转换为 dataframe 然后转换为 ZADCDBD79A8D84175C229B 将 csv 文件压缩到 zip中。
df=spark.read.csv("dbfs:/mnt/ok/csv1.csv")
df.coalesce(1).write.option("compression","gzip").csv("/dbfs/mnt/ok/myzip2.zip")
请不要与上面的 csv 的路径混淆,这里我错误地使用了 ADLS 的另一个 csv。
您可以在下面的 dbfs 中看到 zip 文件。
但是,coalesce 将 zip 中的文件名作为部件名称。 要重命名它,请使用dbuits.fs.mv(old_path,new_path)
ls
获取csv文件路径old_name = r"/dbfs/mnt/ok/myzip2.zip/part-00000-tid-1285084120372550072-c8b0b7bd-b3b4-4432-8575-4e33e5328ec9-6-1-c000.csv.gz"
new_name=r"/dbfs/mnt/ok/myzip2.zip/mycsv.csv.gz"
dbutils.fs.mv(old_name, new_name)
上面的代码是由Alex Ott从这个线程中引用的。
改名后:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.