1

我是 PIG 的新手,并试图解决多行输入(网站)的字数(网站)问题。例如我的输入数据集有值

输入数据

Email     websites
e1        web1 web2 web3 web1 ....
e2        web2 web3 web2 web2 web4 ...
e3        web1 web2 web1 web4 .....

我想要的输出将是

Email     websites
e1        web1(2) web2(1) web3(1) ....
e2        web2(3) web3(1) web4(1) ...
e3        web1(2) web2(1) web4(1) .....

在我的数据集中,我有近 50000 个电子邮件 ID(用户)

4

1 回答 1

1

假设电子邮件和网站是制表符分隔的,并且网站本身是空格分隔的。以下是获得所需输出的分步代码,主要思想是首先对网站进行标记,将它们展平,按(电子邮件,tokenize_website)分组,生成计数,然后通过电子邮件进行分组。

A = LOAD 'sample.txt' AS (email:chararray, urls:chararray);
B = FOREACH A GENERATE email AS email, FLATTEN(TOKENIZE(urls)) AS tokenize_urls;

倾倒 B

e1  web1
e1  web2
e1  web3
e1  web1
e2  web2
e2  web3
......

现在按(电子邮件、标记化 url)分组并生成计数

C = GROUP B BY (email, tokenize_urls); 
D = FOREACH C GENERATE group.email as email, group.tokenize_urls as url, 
                COUNT(B) as url_count;

倾倒 D

e1  web1    2
e1  web2    1
e1  web3    1
e2  web2    3
....

现在通过电子邮件分组

   E = GROUP D BY email;

倾倒 E

e1  {(e1,web1,2),(e1,web2,1),(e1,web3,1)}
e2  {(e2,web2,3),(e2,web3,1)}
e3  {(e3,web1,2),(e3,web2,1),(e3,web4,1)}
......

PS:我自己是 PIG 的新手,所以我的解决方案可能不是最佳的。

于 2013-09-14T08:56:27.153 回答