Pig: можно ли написать цикл над переменными в списке?

Я должен зациклить более 30 переменных в списке

[var1,var2, ... , var30]

и для каждой переменной я использую некоторые group byоператоры PIG, такие как

grouped = GROUP data by var1;
data_var1 = FOREACH grouped{
                            GENERATE group as mygroup,
                                     COUNT(data) as count;
                            };

Есть ли способ обойти список переменных или я вынужден повторить код выше вручную 30 раз в моем коде?

Спасибо!

1 ответ

  1. Я думаю, что вы ищете макрос свиньи

    Создайте отношение для ваших 30 переменных, и повторите их по каждому параметру, и вызовите макрос, который получает 2 парама: Ваше отношение данных и var, который вы хотите сгруппировать.
    Просто проверьте пример в ссылке макрос действительно похож на то, что вы хотели бы сделать.

    Обновление & код

    Итак, вот макрос, который вы можете использовать:

    DEFINE my_cnt(data, group_field) RETURNS C {
            $C = FOREACH (GROUP $data by $group_field) GENERATE
                    group AS mygroup,
                    COUNT($data) AS count;
    };
    

    Использование макроса:

    IMPORT 'cnt.macro';
    
    data = LOAD 'data.txt' USING PigStorage(',') AS (field:chararray, value:chararray);
    DESCRIBE data;
    
    e = my_cnt(data,'the_field_you_group_by');
    DESCRIBE e;
    DUMP e;
    

    Я все еще думаю о том, как вы можете перебирать свои поля, которые вы хотите сгруппировать. Мое первоначальное предложение foreach через отношение, которое содержит имена файлов, не является правильным. (Чтобы создать UDF для этого всегда работает.) Дайте подумать.
    Но этот макрос работает как есть, если вы вызываете все имя файла, которое вы хотите сгруппировать.