1
Предположим, что Pig UDF создает два разных типа данных.Объединение/отделение Pig UDF возвращает
Как скрипт свиньи обрабатывает возвращенный список комбинированных кортежей из этого UDF двумя разными способами?
Например:
public Tuple exec (Tuple input) // input ignored in UDF for simplicity
{
Tuple t = TupleFactory.getInstance().newTuple();
if (Math.random() < 0.5)
t.append ("less than half");
else
t.append (new Date());
return t;
}
Сценарий Pig должен сделать что-то вроде:
register ...
define myUDF ...
data = load ...;
combinedList = foreach data generate myUDF (data);
stringList = filter combinedList by $0 instanceof java.lang.String; // ??
dateList = filter combinedLists by $0 instanceof java.util.Date; //??
store stringList into ... ;
store dateList into ... ;
Спасибо,
Благодарим вас за ответ. Предположим, что UDF изменен, чтобы всегда добавлять как String, так и Date в возвращаемый Tuple (чтобы избежать проблемы с наименьшим сюрпризом). Как писать сценарий Pig Latin для разделения каждого списка? – user2250400
@ user2250400 См. Пункт Nr. 2 в моем ответе - используйте 'SPLIT' с условием. Прочтите подробнее об этом [в документах Pig] (http://pig.apache.org/docs/r0.11.0/basic.html#SPLIT). Основная идея тогда была бы такой, как 'SPLIT c INTO stringlist IF res. $ 0 NOT NULL, datelist IF res. $ 1 IS NOT NULL'. Тем не менее, я по-прежнему предлагаю вам вернуть либо «Date», либо «null» из вашего UDF, а затем обработать недопустимые записи позже в MR, а не так, как вы пытаетесь это сделать. – TC1
Нет ничего плохого в использовании нескольких 'FILTER' вместо' SPLIT'; на самом деле, Pig внутренне перезаписывает 'SPLIT', используя несколько' FILTER'. См. «Нелинейные потоки данных» в http://ofps.oreilly.com/titles/9781449302641/advanced_pig_latin.html. –