2013-04-05 4 views
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 ... ; 

Спасибо,

ответ

0

Есть две проблемы.

  1. Ни при каких обстоятельствах вы когда-либо возвращать различные типы данных с вашего UDF. Это противоречит принципу наименьшего удивления и нескольких других вещей. Если вы хотите указать недопустимое значение, возвращение null или некоторая недопустимая константа будет более подходящей.
  2. То, что вы пытаетесь сделать, не выполняется с несколькими фильтрами, для этого есть операция SPLIT. Хотя ваш пример использования instanceof в Pig неправильный, основное использование будет выглядеть как SPLIT combinedList INTO stringList IF $0 instanceof String, dateList IF $0 instanceof Date.
+0

Благодарим вас за ответ. Предположим, что UDF изменен, чтобы всегда добавлять как String, так и Date в возвращаемый Tuple (чтобы избежать проблемы с наименьшим сюрпризом). Как писать сценарий Pig Latin для разделения каждого списка? – user2250400

+0

@ 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

+0

Нет ничего плохого в использовании нескольких 'FILTER' вместо' SPLIT'; на самом деле, Pig внутренне перезаписывает 'SPLIT', используя несколько' FILTER'. См. «Нелинейные потоки данных» в http://ofps.oreilly.com/titles/9781449302641/advanced_pig_latin.html. –