2015-05-14 2 views
0

A Pig новичок здесь. У меня есть отношение A с несколькими полями (f1, f2 ...). Я хочу быстро увидеть все различные значения, которые есть в каждом поле.Как написать функцию в Pig?

Прямо сейчас, я делаю это:

f1 = FOREACH A GENERATE f1; 
f1 = DISTINCT f1; 
dump f1; 

Я не хочу, чтобы сделать это для каждого поля. Это слишком сложно. Возможно ли вместо этого написать какую-то функцию в Pig для этого. Я смотрел UDF в документации, но я не хочу переключиться на другой язык, например, на Java или Python. Я думаю, что Свинга хорошо для того, что я делаю.

+0

«Я хочу быстро увидеть все различные значения, которые есть в каждом поле». «...» «Я не хочу делать это для каждого поля». «Итак, вы * делаете * и * Не хотите видеть отдельные поля? это высокая задача. – gobrewers14

+0

@ GoBrewers14 К сожалению, я не являюсь носителем английского языка. Если вы поняли, что я имел в виду, не стесняйтесь редактировать вопрос соответствующим образом. – Phani

ответ

4

Что вы ищете является Macro. Это эквивалентно функции.

DEFINE MY_MACRO(relation,field) RETURNS selected_field_distinct { 
    selected_field = FOREACH $relation GENERATE $field; 
    $selected_field_distinct = DISTINCT selected_field; 
}; 


A = LOAD 'input.txt' USING PigStorage(',') AS (f1:chararray, f2:chararray); 

F1 = MY_MACRO(A,'f1'); 
F2 = MY_MACRO(A,'f2'); 

DUMP F1 
DUMP F2 

Пожалуйста, обратите внимание, что:

  • Вы должны объявить макрос выше того места, где вы его используете.
  • Вы также можете написать свой макрос в другом файле и импортировать его в свой скрипт.
  • Невозможно использовать команду DUMP в макросе as described here.
1

мысль, стоит рассмотреть ....

Если значения видели в f1 не будет происходить в f2, то вы можете попробовать этот подход. В этом случае мы выполняем DISTINCT только один раз.

f1 = FOREACH A GENERATE f1; 
    f2 = FOREACH A GENERATE f2; 
    ... 
    f10 = FOREACH A GENERATE f10; 

    all_values = UNION f1,f2,..., f10; 

    uniq_values = DISTINCT all_values; 
    DUMP uniq_values; 
+0

Я искал более общее решение, и использование макросов было бы лучшим в этом случае. Но спасибо, я узнал об использовании «DISTINCT» по отношению из-за вашего ответа. – Phani

Смежные вопросы