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

Apache pig PIG:计算每篇文章的wiki pagecount数据请求的最高月增长率,apache-pig,mediawiki,Apache Pig,Mediawiki,我有几个维基转储数据从 现在我想计算一下2015年每一篇维基文章的每月请求量增长,然后找出每一篇文章请求量增长最快的月份,以及增长的幅度有多大。。。 说明:wikidata的格式为: “wikiproject”“文章url”“请求数”“页面大小(字节)”,例如: fr.b特别版:里切赫/阿喀琉·巴拉盖d%5C%27Hilliers 1624 en主页242332 4737756101 我们的群集设置仍在“进行中”,因此我必须在具有较小数据集的cloudera quickstart VM上进行尝试

我有几个维基转储数据从 现在我想计算一下2015年每一篇维基文章的每月请求量增长,然后找出每一篇文章请求量增长最快的月份,以及增长的幅度有多大。。。 说明:wikidata的格式为: “wikiproject”“文章url”“请求数”“页面大小(字节)”,例如: fr.b特别版:里切赫/阿喀琉·巴拉盖d%5C%27Hilliers 1624 en主页242332 4737756101

我们的群集设置仍在“进行中”,因此我必须在具有较小数据集的cloudera quickstart VM上进行尝试。。我只使用了3个月中1小时的页面转储。。。然而,当我试图说明它时,它耗尽了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)对每月的数据集进行分组,然后将它们组合在一起。然后我计算每篇文章和每个月的请求总数,为了计算请求的增长,我使用下个月的请求总数,减去上个月同一篇文章的请求总数,并检查它是否>0(如果有任何增长),然后,我通过maxRequests(=maxZugriffe)按降序计算所有增长值的最大值,或我的关系,并将输出限制为10

有人能从代码中推断出是这样的吗,还是我遗漏了什么?正如我所说,对于quickstart虚拟机来说,计算结果似乎太多了,但对我来说,它似乎并不那么复杂

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


编辑:几周过去了。。。。仍然没有答案,有人能帮忙吗?

回答您的第二个问题“是否可以在pig中为bincondition表达式使用别名?” 我们不能在双条件表达式中使用别名。这种情况不仅适用于pig,在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)
创建了另一列,并在表达式中使用了它。 希望这个答案对你有用。
多谢各位

所以没人知道这是怎么回事?//有人找到解决办法了吗?需要帮助…嗨,用户2774480你觉得这个答案有用吗?或者您需要更多有用的澄清吗?在我的pig代码中,始终使用foreach子句生成新的关系可以吗?还是应该使用嵌套的foreach更好?这在嵌套的foreach中是可能的吗?foreach子句的使用取决于一种情况和我们对其工作原理的理解程度。