Как хранить сжатые файлы с помощью PigStorage в Apache Pig?

Apache Pig v0.7 может читать сжатые файлы без каких-либо дополнительных усилий с моей стороны, например:

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, я бы хотел его услышать.


person PP.    schedule 11.02.2011    source источник


Ответы (3)


Есть два способа:

  1. Как упоминалось выше, в хранилище вы можете указать выходной каталог как

    usercount.gz STORE UserCount INTO '/tmp/usercount.gz' USING PigStorage(',');

  2. Установите метод сжатия в вашем скрипте.

    set output.compression.enabled true; set output.compression.codec org.apache.hadoop.io.compress.GzipCodec;

person ysr    schedule 27.11.2012

Для 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

person medriscoll    schedule 24.02.2011
comment
Отличный ответ. К сожалению, Amazon Elastic Map-Reduce поддерживает только Pig v0.6. - person PP.; 23.03.2011
comment
К вашему сведению: в настоящее время EMR использует Pig версии 0.9.2 по умолчанию, так что теперь это должно работать. - person Dolan Antenucci; 29.06.2012

Согласно документации 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 см. здесь.

Указание сжатия через свойства задания

Установив следующие свойства в вашем скрипте свиньи, то есть 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;
person Abbas Gadhia    schedule 12.05.2015