Как хранить 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;