A = LOAD '/tmp/Links.txt.gz' USING PigStorage();
Store A into '/tmp/tmp_unzipped/' USING PigStorage();
mv /tmp/tmp_unzipped/part-m-00000 /tmp/unzipped/Links.txt
rm /tmp/tmp_unzipped/
# !/bin/bash
workdir=/tmp/unziphdfs/
cd $workdir
# get all zip files in a folder
zips=$(hadoop fs -ls /yourpath/*.zip | awk '{print $8}')
for hdfsfile in $zips
do
echo $hdfsfile
# copy to temp folder to unpack
hdfs dfs -copyToLocal $hdfsfile $workdir
hdfsdir=$(dirname "$hdfsfile")
zipname=$(basename "$hdfsfile")
# unpack locally and remove
unzip $zipname
rm -rf $zipname
# copy files back to hdfs
files=$(ls $workdir)
for file in $files; do
hdfs dfs -copyFromLocal $file $hdfsdir
rm -rf $file
done
# optionally remove the zip file from hdfs?
# hadoop fs -rm -skipTrash $hdfsfile
done
hadoop fs -get <your_source_directory> <directory_name>
It will create a directory where you run hadoop command. cd to it and gunzip all the files
cd ..
hadoop fs -moveFromLocal <directory_name> <target_hdfs_path>
5条答案
按热度按时间vcudknz31#
hadoop的
FileUtil
班级有unTar()
以及unZip()
实现这一点的方法。这个unTar()
方法将起作用.tar.gz
以及.tgz
还有文件。不幸的是,它们只处理本地文件系统上的文件。你得用同一个班的copy()
方法在需要使用的任何分布式文件系统之间进行复制。dgsult0t2#
如果您有压缩文本文件,hadoopfs-text支持gzip以及其他常见的压缩格式(snappy、lzo)。
zqry0prt3#
我可以通过三种不同的方式来实现它。
使用linux命令行
服从命令对我有效。
我的gzip文件是
Links.txt.gz
输出存储在/tmp/unzipped/Links.txt
使用java程序在
Hadoop The Definitve Guide
书上有一节Codecs
. 在该部分中,有一个程序使用CompressionCodecFactory
. 我正在按原样重新生成代码:此代码将gz文件路径作为输入。
您可以这样执行:
例如,当我执行gzip文件时:
我在以下位置得到了解压文件:
/tmp/Links.txt
它将解压后的文件存储在同一个文件夹中。因此您需要修改此代码以获取2个输入参数:<input file path> and <output folder>
.一旦这个程序运行起来,就可以编写一个shell/perl/python脚本来为每个输入调用这个程序。
使用pig脚本
您可以编写一个简单的pig脚本来实现这一点。
我写了以下脚本,很有效:
运行此脚本时,解压缩的内容存储在临时文件夹中:
/tmp/tmp_unzipped
. 此文件夹将包含这个
part-m-00000
包含解压缩的文件。因此,我们需要使用以下命令显式地重命名它,最后删除
/tmp/tmp_unzipped
文件夹:因此,如果使用这个pig脚本,只需注意参数化文件名(links.txt.gz和links.txt)。
同样,一旦这个脚本正常工作,就可以编写一个shell/perl/python脚本来为每个输入调用这个pig脚本。
bnlyeluc4#
bash解决方案
在我的例子中,我不想通过管道解压文件,因为我不确定它们的内容。相反,我想确保zip文件中的所有文件都将放在hdfs上。
我创建了一个简单的bash脚本。评论应该能给你一个线索。下面有一个简短的描述。
说明
获取所有
*.zip
文件在hdfs
目录一个接一个:复制
zip
到临时目录(在文件系统上)解压
将所有提取的文件复制到zip文件的目录
清理
我设法让它使用sub-dir结构来处理每个文件中的许多zip文件,使用
/mypath/*/*.zip
.祝你好运:)
vktxenjb5#
您可以使用配置单元(假设它是文本数据)来实现这一点。
数据将被解压成新的文件集。
如果不想更改名称,并且运行的节点上有足够的存储空间,则可以这样做。