Соединение с помощью условного оператора OR выдает ошибку

#join #apache-pig

#Присоединиться #apache-pig

Вопрос:

 child = load 'file_name' using PigStorage('t') as (child_code : chararray, child_id : int, child_precode_id : int);
parents = load 'file_name' using PigStorage('t') as (child_id : int, child_internal_id : chararray, mother_id : int, father_id : int);
joined = JOIN child by child_id, parents by child_id;
mainparent = FOREACH joined GENERATE child_id as child_id_source, child_precode_id, child_code;
store parent into '(location of file)' using PigStorage('t');
childfirst = JOIN  mainparent by (child_id_source), parents by (mother_id OR father_id);
firstgen = FOREACH childfirst GENERATE child_id, child_precode_id, child_code;   
store firstgen into 'file_location' using PigStorage('t');
  

Получение следующей ошибки при использовании условия OR:

ОШИБКА org.apache.pig.PigServer — исключение во время синтаксического анализа: ошибка во время синтаксического анализа. Скрипту Pig не удалось выполнить синтаксический анализ: NoViableAltException(91@[]) Не удалось выполнить синтаксический анализ: скрипту Pig не удалось выполнить синтаксический анализ: NoViableAltException(91@[])

Ответ №1:

Приведенный ниже синтаксис неверен, в Pig нет условного соединения

 childfirst = JOIN  mainparent by (child_id_source), parents by (mother_id OR father_id);
  

Если вы хотите соединить отношение с одним ключом с другим отношением по 2 ключам, создайте два объединения и объедините набор данных.Обратите внимание, что вам, возможно, придется различать результирующее отношение.

 childfirst = JOIN  mainparent by (child_id_source), parents by (mother_id);
childfirst1 = JOIN  mainparent by (child_id_source), parents by (father_id);
childfirst2 = UNION childfirst,childfirst1;
childfirst3 = DISTINCT childfirst2;
firstgen = FOREACH childfirst3 GENERATE child_id, child_precode_id, child_code;   
store firstgen into 'file_location' using PigStorage('t');
  

Комментарии:

1. Это работает, это также решает проблему получения дубликатов, спасибо