如何在 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:`我在远程 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 文件的主要内容,如果未能解决你的问题,请参考以下文章