PIG:计算每篇文章的wiki页数数据请求的每月最高增长率

时间:2016-04-19 16:45:42

标签: apache-pig mediawiki

我有几个来自https://dumps.wikimedia.org/other/pagecounts-raw/2015/的wiki转储数据 现在我想计算2015年每篇维基文章请求的月度增长情况,然后找出一篇文章请求增长最快的月份,以及这种增长有多高...... 解释:wikidata的格式为: " File文件历史" "文章-URL" "请求数量" "以字节为单位的页面大小",例如: fr.b Special:Recherche / Achille_Baraguey_d%5C%27Hilliers 1 624 en Main_Page 242332 4737756101

我们的群集设置仍然正在进行中"所以我必须在具有较小数据集的cloudera quickstart VM上试用它。我在3个月的1小时内仅使用了pagedumps。但是当我试图说明它时,它用完JAVA堆空间,或者我得到消息GC重载....

这是我的代码:

m1  = LOAD '/user/cloudera/2015/2015-01' USING PigStorage(' ') as(proj:chararray, url:chararray, req:long, size:long);
m2  = LOAD '/user/cloudera/2015/2015-02' USING PigStorage(' ') as(proj:chararray, url:chararray, req:long, size:long);
m3  = LOAD '/user/cloudera/2015/2015-03' USING PigStorage(' ') as(proj:chararray, url:chararray, req:long, size:long);

m11 = SAMPLE m1 0.1;
m22 = SAMPLE m2 0.1;
m33 = SAMPLE m3 0.1;

a = COGROUP m11 by url, m22 by  url, m33 by  url;
b = FOREACH a generate group, SUM(m11.req) as s1, SUM(m22.req) as s2, SUM(m33.req) as s3;
c = FOREACH b generate group, ((s2-s1) > 0 ? (s2-s1): 0) as dm2, ((s3-s2)> 0 ? (s3-2): 0) as dm3 parallel 10;
d = FOREACH c generate group as Artikel, MAX(TOBAG(dm2,dm3)) as maxZugriffe;
e = order d by maxZugriffe desc;
f = limit e 10;

所以我试图做的是,首先我采样10%的原始数据,然后我按照文章(= url)对每月数据集进行分组,然后将它们组合在一起。然后我计算每篇文章和每个月的请求总和,计算请求的增长,我使用下个月的请求总和,并减去上个月同一篇文章的请求总和,并检查它是否' s> 0(如果有任何增长),那么我按降序计算所有增长值的最大值和maxRequests(= maxZugriffe)的关系,并将输出限制为10 ......

有人可以从代码中推断出这样的话,还是我错过了什么?正如我所说的那样,快速入门VM计算结果似乎太多了,但它对我来说似乎并不那么复杂......

我的第二个问题是:是否可以在猪中使用bincondition表达式的别名?例如: c = FOREACH b生成组,((s2-s1)为' diff'> 0?diff:0)为dm2; 所以我想用别名替换第一个案例'差异'我已经计算过,而不是再次计算(s2-s1)...

编辑:有些星期过去......但仍然没有答案,有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

回答你的第二个问题"是否可以在猪中使用bincondition表达式的别名?" 我们不能在bicondition表达式中使用别名。这不仅适用于猪,在SQL中我们也不能使用它。 我们不能给没有(=)赋值运算符的表达式赋予别名 如果您确实希望避免重复使用表达式,请执行以下操作

b = FOREACH a generate group, SUM(m11.req) as s1, SUM(m22.req) as s2, SUM(m33.req) as s3;  
x = FOREACH b generate group,s1,s2,s3,(s2-s1) as diff;  
c = FOREACH x generate group, (diff > 0 ? diff: 0) as dm2;

在我们所做的工作中,我们使用别名diff为(s2-s1)创建了另一列,并在表达式中使用了它。 希望你觉得这个答案很有用。 谢谢。

相关问题