Ответ 1
Я могу думать о достижении этого тремя способами.
-
Использование командной строки Linux
Следующая команда работала для меня.
hadoop fs -cat /tmp/Links.txt.gz | gzip -d | hadoop fs -put - /tmp/unzipped/Links.txt
Мой gzipped файл
Links.txt.gz
Выход сохраняется в/tmp/unzipped/Links.txt
-
Использование программы Java
В книге
Hadoop The Definitve Guide
есть разделCodecs
. В этом разделе есть программа для декомпрессии вывода с помощьюCompressionCodecFactory
. Я обновляю этот код так:package com.myorg.hadooptests; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.io.compress.CompressionCodec; import org.apache.hadoop.io.compress.CompressionCodecFactory; import java.io.InputStream; import java.io.OutputStream; import java.net.URI; public class FileDecompressor { public static void main(String[] args) throws Exception { String uri = args[0]; Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(URI.create(uri), conf); Path inputPath = new Path(uri); CompressionCodecFactory factory = new CompressionCodecFactory(conf); CompressionCodec codec = factory.getCodec(inputPath); if (codec == null) { System.err.println("No codec found for " + uri); System.exit(1); } String outputUri = CompressionCodecFactory.removeSuffix(uri, codec.getDefaultExtension()); InputStream in = null; OutputStream out = null; try { in = codec.createInputStream(fs.open(inputPath)); out = fs.create(new Path(outputUri)); IOUtils.copyBytes(in, out, conf); } finally { IOUtils.closeStream(in); IOUtils.closeStream(out); } } }
Этот код принимает путь к файлу gz как входной.
Вы можете выполнить это как:FileDecompressor <gzipped file name>
Например, когда я выполнил для моего gzipped файла:
FileDecompressor /tmp/Links.txt.gz
Я получил распакованный файл по адресу:
/tmp/Links.txt
Сохраняет распакованный файл в той же папке. Поэтому вам нужно изменить этот код, чтобы принять 2 входных параметра:
<input file path> and <output folder>
.Как только вы заработаете эту программу, вы можете написать оболочку /Perl/Python script для вызова этой программы для каждого из ваших входов.
-
Использование Pig script
Вы можете написать простой Pig script, чтобы достичь этого.
Я написал следующий script, который работает:
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/
Когда вы запускаете этот script, распакованное содержимое сохраняется во временной папке:
/tmp/tmp_unzipped
. Эта папка будет содержать/tmp/tmp_unzipped/_SUCCESS /tmp/tmp_unzipped/part-m-00000
part-m-00000
содержит распакованный файл.Следовательно, нам нужно явно переименовать его с помощью следующей команды и, наконец, удалить папку
/tmp/tmp_unzipped
:mv /tmp/tmp_unzipped/part-m-00000 /tmp/unzipped/Links.txt rm /tmp/tmp_unzipped/
Итак, если вы используете этот Pig script, вам просто нужно позаботиться о параметризации имени файла (Links.txt.gz и Links.txt).
Опять же, как только вы запустите этот script, вы можете написать оболочку /Perl/Python script для вызова этого Pig script для каждого из ваших входов.