Python 如何在HDFS中解压缩多个zip文件
我在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 我正在寻找一些命令,如以下任何技术(
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,您需要执行下面的示例,如命令hadoop fs-cat abc.zip | unzip-d xxxx | hadoop fs-put src dest
我用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)