如何在 HDFS 中解压缩多个 zip 文件

Posted

技术标签:

【中文标题】如何在 HDFS 中解压缩多个 zip 文件【英文标题】:How to unzip multiple zip files in HDFS 【发布时间】:2016-05-06 22:41:19 【问题描述】:

我在 HDFS 中有多个 zip 文件,其中包含两种类型的文件(A.csv & B.csv)

HDFS 位置

/data/jan.zip --> contains A.csv & B.csv 
/data/feb.zip --> contains A.csv & B.csv

我想将文件提取到 HDFS 位置,如下所示

/data/jan/A.csv
/data/jan/B.csv
/data/feb/A.csv
/data/feb/B.csv

我正在任何技术(spark、pig、hive、..)中寻找类似下面的命令

hadoop fs -unzip hdfs://..../abc.zip

【问题讨论】:

查看blog.puneethabm.in/hadoop-hdfs-commands 我尝试了博客中给出的命令,但没有成功。它正在创建一些带有 zip 文件头和随机字符的 txt 文件 【参考方案1】:
    您可以使用 UNIX pipes。 在您的情况下,您需要遍历 hdfs 中的数据文件夹,并且对于每个 zip,您需要执行以下示例,例如命令

例如: hadoop fs -cat abc.zip | unzip -d xxxx | hadoop fs -put src dest

    您可以使用 identitymapper,这可能有点奇怪。 您可以通过 Java 尝试FileUtils,它具有以下方法。 我在 Hadoop API 中搜索,我得到了这个我没有尝试过,但根据文档它可能有效。

【讨论】:

第一个选项不起作用。你能检查一下吗让我知道 @Munesh:我的回答有帮助吗?如果可以,请。接受它 在执行给定命令 hadoop fs .. 时,抛出以下错误。错误:必须使用 -d 选项指定要提取的目录 put:`/test':没有这样的文件或目录 cat:无法写入输出流。能否请您 chk 一次让我知道我错过了什么 b4 接受答案? 这是示例命令,它给出了想法。此外, unzip 是 Linux 命令,您可以查看手册页 (linux.die.net/man/1/unzip) -d 选项期望目录解压缩。另请参阅此示例,了解如何循环遍历 hdfs 目录 (***.com/questions/28685471/…) 但在您的情况下,您需要遍历一个目录下的 zip。不幸的是,我现在无法测试,因为我没有要测试的集群或虚拟机。 如果您从 Java 集成,我很确定 FileUtils 可以工作。如果你想使用 Java 解决方案,你需要遍历一个 HDFS 目录下的 zip 文件,你需要使用 FileUtils 方法解压缩每个文件。 &我不知道python。【参考方案2】:

我在远程 hdfs 中的本地电脑上使用 Python 3 制作了它。如果它有帮助...比! 您可以将以下脚本改编为您的 pyspark。

您需要以下库:

from zipfile import ZipFile
from io import BytesIO
from hdfs import Client, HdfsError

前两个是原生的,应该安装“hdfs”。 我用https://pypi.org/project/hdfs/。你可以使用其他任何你喜欢的东西。

所以,这是脚本:

hdfs_client = Client('s%:s%') % (YOUR_HDFS_HOST, YOUR_HDFS_PORT)
main_dir_path = '/data'

for fls in hdfs_client.list(main_dir_path):
    file_path = '%s/%s' % (main_dir_path, fls)

    if fls.find('.zip') != -1:
        file_name, file_suffix = fls.split('.')
        fold_new_name = '%s/%s' % (main_dir_path, file_name)

        try:
            hdfs_client.makedirs(fold_new_name)
            print(fold_new_name)
        except HdfsError as h_err:
            print(h_err)

        with hdfs_client.read(file_path) as reader:
            zip_content = reader.read()
            zip_file = ZipFile(BytesIO(zip_content))

            for z_fls in zip_file.namelist():
                single_file_content = zip_file.read(z_fls)
                zip_file_new_path = '%s/%s' % (fold_new_name, z_fls)
                hdfs_client.write(zip_file_new_path, single_file_content)
                print('%s file extracted' % zip_file_new_path)

我知道这是一个很好的转储解决方案,但它确实有效。 希望它对某人有所帮助。

【讨论】:

以上是关于如何在 HDFS 中解压缩多个 zip 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中解压缩多层 zip 文件

如何从多个 tar 文件中解压缩特定文件并压缩它们?

如何在iOS中解压缩异步方式的zip文件?

如何在php中解压缩zip文件[重复]

在 Java 中解压缩包含多个文件和目录的 7zip 存档 [关闭]

如何使用内部 Windows XP 选项在 VBScript 中解压缩文件