Как хранить gzip файлы с помощью PigStorage в Apache Pig?
Apache Pig v0.7 может читать gzipped файлы без каких-либо дополнительных усилий с моей стороны, например:
MyData = LOAD '/tmp/data.csv.gz' USING PigStorage(',') AS (timestamp, user, url);
Я могу обрабатывать эти данные и выводить их на диск в порядке:
PerUser = GROUP MyData BY user;
UserCount = FOREACH PerUser GENERATE group AS user, COUNT(MyData) AS count;
STORE UserCount INTO '/tmp/usercount' USING PigStorage(',');
Но выходной файл не сжимается:
/tmp/usercount/part-r-00000
Есть ли способ сообщить команде STORE
выводить содержимое в формате gzip? Обратите внимание, что в идеале я бы хотел получить ответ, применимый для Pig 0.6, поскольку я хочу использовать Amazon Elastic MapReduce; но если есть решение для любой версии Pig, я бы хотел ее услышать.
Ответы
Ответ 1
Существует два способа:
-
Как упоминалось выше в хранилище, вы можете указать выходной каталог как
usercount.gz
STORE UserCount INTO '/tmp/usercount.gz' USING PigStorage(',');
-
Установите метод сжатия в script.
set output.compression.enabled true;
set output.compression.codec org.apache.hadoop.io.compress.GzipCodec;
Ответ 2
Для Pig r0.8.0 ответ так же прост, как дать вашему пути вывода расширение ".gz" (или ".bz", если вы предпочитаете bzip).
Последнюю строку вашего кода следует изменить следующим образом:
STORE UserCount INTO '/tmp/usercount.gz' USING PigStorage(',');
В вашем примере ваш выходной файл будет найден как
/tmp/usercount.gz/part-r-00000.gz
Для получения дополнительной информации см. https://pig.apache.org/docs/r0.8.1/piglatin_ref2.html#PigStorage
Ответ 3
В соответствии с документацией Pig для PigStorage есть 2 способа сделать это
Задание формата сжатия с помощью оператора 'STORE'
STORE UserCount INTO '/tmp/usercount.gz' USING PigStorage(',');
STORE UserCount INTO '/tmp/usercount.bz2' USING PigStorage(',');
STORE UserCount INTO '/tmp/usercount.lzo' USING PigStorage(',');
Обратите внимание на приведенные выше утверждения. Pig поддерживает 3 формата сжатия, то есть GZip, BZip2 и LZO. Для получения LZO вы должны установить его отдельно. См. здесь для получения дополнительной информации о lzo.
Задание сжатия через свойства задания
Установив следующие свойства в вашей свине script, i.e output.compression.enabled
и output.compression.codec
с помощью следующего кода
set output.compression.enabled true;
и
set output.compression.codec com.hadoop.compression.lzo.LzopCodec;
set output.compression.codec org.apache.hadoop.io.compress.GzipCodec;
set output.compression.codec org.apache.hadoop.io.compress.BZip2Codec;