2011-04-15 71 views
1

我有一个模式,描述各种文章中单词的tf-idf值。 它的描述是这样的:如何从Pig中的关系生成自定义模式?

tfidf_relation: {word: chararray,id: bytearray,tfidf: double} 

这里有一个这样的数据的一个例子:

(cat,article_one,0.13515503603605478) 
(cat,article_two,0.4054651081081644) 
(dog,article_one,0.3662040962227032) 
(apple,article_three,0.3662040962227032) 
(orange,article_three,0.3662040962227032) 
(parrot,article_one,0.13515503603605478) 
(parrot,article_three,0.13515503603605478) 

我想在一个形式输出: 猫article_one 0.13515503603605478,article_two 0.4054651081081644 等。 问题是,我如何从这个包含单词字段和id和tfidf字段元组的关系? Someting like:

X = FOREACH tfidf_relation GENERATE word, (id, tfidf); 

不起作用。这是什么正确的语法?

回答

0
X = FOREACH tfidf_relation GENERATE word, {(id, tfidf)}; 

这可能是你需要的。

+0

Wojtek,我已经尝试过不同形式的解决方案 - 每次解析错误发生在符号“{”。 – user710450 2011-04-19 20:01:44

+0

好吧,我认为我已经实现了这个使用Java例程嵌入。但正确的猪语法(和可能性本身)仍然是有趣的。 – user710450 2011-04-19 20:52:23

+0

X.(id,tfidf)呢?你总是可以按字组合,然后拼合组合(如果我记得这样的话),但是可能更简单的方法就是编写快速的UDF。 – wlk 2011-04-19 22:55:29

1

试试这个:

t = LOAD 'input/file' USING PigStorage(',') as (word: chararray,id: bytearray,tfidf: double); 
    u = group t by word; 
    dump u; 

输出将是

(cat,{(cat,article_two,0.4054651081081644),(cat,article_one,0.13515503603605478)}) 
    (dog,{(dog,article_one,0.3662040962227032)}) 
    (apple,{(apple,article_three,0.3662040962227032)}) 
    (orange,{(orange,article_three,0.366204096222703)}) 
    (parrot,{(parrot,article_three,0.13515503603605478), 
    (parrot,article_one,0.13515503603605478)}) 

我希望这是你在找什么。