2012-01-12 1 views
1

Я застрял на этом несколько часов, и я не могу понять, что я делаю неправильно. У меня есть отношение "сгруппированные" со схемойСсылка на поле во вложенном кортеже в 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

+0

Не могли бы вы включить пару строк вашего ввода и ваш свиной скрипт? Было бы здорово, если бы я мог подключить его к Pig и поиграть с ним, чтобы помочь вам. –

+0

уверенный; это довольно немного долго, но: keywords = LOAD 'test' as (seedword: chararray, doc: chararray); group_by_seedword = ключевые слова GROUP BY $ 0; – YuliaPro

+0

Я добавил код и образец файла в исходный вопрос! Спасибо. Я начинаю думать, что здесь есть ошибка: FOREACH grouped GENERATE seedword, baggy.groupy; Я также получаю сообщение об ошибке: Недопустимая ссылка на поле. Ссылоченное поле [groupy] не существует в схеме: seedword: chararray, coward: char array. (поэтому он выглядит , игнорируя все вложенные кортежи). – YuliaPro

ответ

1

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

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