繁体   English   中英

在dbfs(databricks文件存储)中压缩CSV为ZIP

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM