Как умножить несколько полей кортежа на заданное поле кортежа

Для каждой строки данных я хотел бы умножить поля от 1 до N на поле 0. Данные могут иметь сотни полей в строке (или переменное количество полей в этом отношении), поэтому запись каждой пары невозможна. Есть ли способ указать диапазон полей, как в следующем (неправильном) фрагменте?

A = LOAD 'foo.csv' USING PigStorage(','); 
B = FOREACH A GENERATE $0*($1,..);

person balti    schedule 24.04.2012    source источник


Ответы (1)


Здесь может пригодиться UDF.

Реализуйте exec(Tuple input) и выполните итерацию по всем полям кортежа следующим образом (не проверено):

public class MultiplyField extends EvalFunc<Long> {
    public Long exec(Tuple input) throws IOException {
        if (input == null || input.size() == 0) {
            return null;
        }
        try {
        Long retVal = 1;
        for (int i = 0; i < input.size(); i++) {
            Long j = (Long)input.get(i);
            retVal *= j;
        }
        return retVal;
        } catch(Exception e) {
            throw WrappedIOException.wrap("Caught exception processing input row ", e);
        }
    }
}

Затем зарегистрируйте свою UDF и вызовите ее из FOREACH.

person Frederic    schedule 02.11.2012