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

Python 如何在HDFS中解压缩多个zip文件,python,hadoop,apache-spark,mapreduce,apache-pig,Python,Hadoop,Apache Spark,Mapreduce,Apache Pig,我在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 我正在寻找一些命令,如以下任何技术(

我在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
我正在寻找一些命令,如以下任何技术(火花,猪,蜂巢,…)

  • 您可以使用UNIX
    管道
    。 在您的情况下,您需要在hdfs中的数据文件夹中循环,对于每个zip,您需要执行下面的示例,如命令
  • 例如:
    hadoop fs-cat abc.zip | unzip-d xxxx | hadoop fs-put src dest

  • 您可以使用identitymapper,这可能有点奇怪
  • 您可以尝试通过Java,它有以下方法。 我在HadoopAPI中搜索,我得到了这个,我还没有尝试过这个,但根据文档,它可能会工作。

  • 我用Python3在远程hdfs的本地pc上制作了它。如果有帮助的话。。。太棒了! 您可以将以下脚本改编为pyspark

    您需要以下库:

    from zipfile import ZipFile
    from io import BytesIO
    from hdfs import Client, HdfsError
    
    前两个是本机的,应安装“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)
    
    我知道这是一个很好的解决方案,但它是有效的。
    希望对某人有所帮助。

    检查此项我尝试了博客中给出的命令,但无效。它正在创建一些带有zip文件头的txt文件&random charsFirst选项不起作用。你能检查一下吗?让我看看know@Munesh我的回答有用吗?如果可以的话,你可以。在执行给定命令hadoop fs..时接受它,将抛出以下错误。错误:必须使用-d选项put:`/test:指定要提取到的目录:没有这样的文件或目录cat:无法写入输出流。你能不能让chk告诉我我错过了什么b4接受答案?这是一个示例命令,它给出了想法。此外,解压是一个Linux命令,您可以看到manual page()-d选项期望目录解压。还可以看到这个如何循环hdfs目录()的示例,但在您的示例中,您需要循环一个目录下的zip。不幸的是,我现在无法进行测试,因为我没有集群或虚拟机来测试。如果您从Java进行集成,我很肯定FileUtils可以工作。如果您想使用Java解决方案,您需要循环一个HDFS目录下的zip文件,并且需要使用FileUtils方法解压每个文件我不懂python。
    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)