Поле ссылки во вложенном кортеже в PIG;

Я застрял на этом в течение нескольких часов, и я не могу понять, что я делаю неправильно. У меня есть отношение, "сгруппированное" со схемой

    grouped: {seedword: chararray,baggy: {outertup: (groupy: (seedword: chararray,coword: chararray))}}

Пример того, как выглядит отношение: (авто,{((авто,автомобиль)),((авто,грузовик))})

Мне нужно сгенерировать только начальное слово и кортеж кослов. В моем примере я хотел бы

(автомобиль, (автомобиль, грузовик)).

Я пытался:

 FOREACH grouped GENERATE baggy::outertup.groupy.coword;

 FOREACH grouped GENERATE baggy.outertup.groupy.coword;
 FOREACH grouped GENERATE baggy.groupy.coword;

и ни один из них не работает, и выдает мне сообщения об ошибках, в которых говорится, что такого поля нет. Пожалуйста помоги! !!

ЗДЕСЬ еще немного моего кода:

keywords = LOAD 'merged' USING as ( seedword:chararray, doc:chararray);

---COUNT HOW MANY DOCUMENTS EACH WORD IS IN
group_by_seedword = GROUP keywords BY $0;

invert_index = FOREACH group_by_seedword GENERATE $0 as seedword:chararray, keywords.$1;
word_doc_count= FOREACH invert_index GENERATE seedword, COUNT($1);

-- map words to document
words_in_doc= GROUP keywords BY doc;
word_docs = FOREACH words_in_doc GENERATE group AS doc, keywords.seedword;
--(document:(keyword, keyword, keyword...))

--map words to their cowords in doc
temp_join = JOIN keywords BY doc,word_docs BY doc;
--DUMP temp_join;
cowords_by_doc = FOREACH temp_join GENERATE $0 as seedword:chararray, $3 as cowords;

cowords_interm=  FOREACH cowords_by_doc GENERATE seedword, FLATTEN(cowords);
cowords = FILTER cowords_interm BY (seedword!=$1);---GETS RID OF SINGLE DOC WORD; 
temp_join_count1 = JOIN cowords BY $0, word_doc_count BY seedword; 

-- GETS WORDS THAT OCCURE BY THEMSELVES IN A SINGLE DOCUMENT
G = JOIN cowords_interm BY $0 LEFT OUTER, cowords by $0;
orph_word = FILTER G BY $2 is null;
orph_word_count = FOREACH orph_word GENERATE $0,null, 0;

temp_join_count= UNION temp_join_count1, orph_word_count; 

inter_frac = FOREACH temp_join_count GENERATE $0 as seedword:chararray, $1 as coword:chararray, 1.0/$3 as frac:double;
inter_frac_combine = GROUP inter_frac BY (seedword, coword); 
inter_frac_sum = FOREACH inter_frac_combine GENERATE $0 , SUM(inter_frac.frac) as frac:double;

filtered = FILTER inter_frac_sum BY ($1 >=$relatedness_ratio);
grouped= GROUP filtered by $0.seedword;
g = FOREACH grouped GENERATE group as seedword:chararray, filtered.$0;   
named = FOREACH g GENERATE $0 as seedword:chararray, $1 as baggy:bag{(outertup:tuple(groupy:tuple(seedword:chararray, coword:chararray)))};

входной файл, который вы можете попробовать, должен быть таким:

car doc1.txt
auto doc1.txt
bunny doc2.txt
ball doc2.txt
toy car doc2.txt
random doc3.txt

самолет doc3.txt


person YuliaPro    schedule 12.01.2012    source источник
comment
Не могли бы вы включить пару строк вашего ввода и ваш сценарий свиньи? Было бы здорово, если бы я мог подключить его к Pig и поиграть с ним, чтобы помочь вам.   -  person Donald Miner    schedule 13.01.2012
comment
Конечно; это довольно длинно, но: ключевые слова = LOAD 'test' as (seedword:chararray, doc:chararray); group_by_seedword = СГРУППИРОВАТЬ ключевые слова ПО $0;   -  person YuliaPro    schedule 13.01.2012
comment
Я добавил код и образец файла в исходный вопрос! Спасибо. Я начинаю думать, что здесь ошибка: FOREACH grouped GENERATE seedword, baggy.groupy; Я также получаю сообщение об ошибке: Неверная ссылка на поле. Ссылочное поле [groupy] не существует в схеме: seedword:chararray,coward:char array. (так что, похоже, он игнорирует все вложенные кортежи).   -  person YuliaPro    schedule 13.01.2012
comment
Попробуйте сгладить внутреннюю сумку, а затем выберите элемент $1 из каждого кортежа.   -  person Gaurav Phapale    schedule 09.05.2014


Ответы (1)


У меня была аналогичная проблема, когда я не мог ссылаться на внутренние кортежи. Мое решение состояло в том, чтобы сгладить данные, а затем еще немного отфильтровать и сгруппировать. Ура В

person user2019983    schedule 29.01.2013