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

时间:2016-05-06 22:41:20

标签: 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

我正在寻找任何技术(火花,猪,蜂巢,......)下面的一些命令

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

2 个答案:

答案 0 :(得分:1)

  1. 您可以使用UNIX Editor。 在您的情况下,您需要循环遍历hdfs中的数据文件夹以及您需要在下面执行的每个zip文件,如命令
  2. 例如:     的 var scrollViewHeader = new ScrollView { HeightRequest = 200, Content = label };

    1. 你可以使用identitymapper这可能有点奇怪。
    2. 您可以通过Java尝试FileUtils,其中包含以下方法。 我在Hadoop API中搜索,我得到了这个我没有尝试过这个,但根据文档,它可能会工作。 enter image description here

答案 1 :(得分:1)

我是通过Python 3在远程hdfs中从本地PC上实现的。如果有帮助的话,那就太好了! 您可以将以下脚本调整为适合您的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)

我知道这是一个不错的转储解决方案,但是它可以工作。 希望它对某人有帮助。