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

tjrkku2a  于 2021-06-21  发布在  Pig
关注(0)|答案(1)|浏览(507)

我有几个维基转储数据来自https://dumps.wikimedia.org/other/pagecounts-raw/2015/ 现在我想计算一下2015年每一篇维基文章的每月请求增长率,然后找出一篇文章请求增长率最高的月份,以及增长率有多高。。。解释:wikidata的格式为:“wikiproject”“article url”“请求数”“页面大小(字节)”,例如:fr.bspecial:recherche/achille_baraguey_d%5c%27hilliers 1624 en主页242332 4737756101
我们的集群设置仍在“进行中”,因此我必须在具有较小数据集的cloudera quickstart虚拟机上进行尝试。。我只使用了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。。。
有人能从代码中推断出是这样,还是我遗漏了什么?正如我所说的,对于快速启动虚拟机来说,计算结果似乎太多了,但对我来说似乎没有那么复杂。。。
我的第二个问题是:pig中的bincondition表达式是否可以使用别名?e、 g:c=foreach b生成组,((s2-s1)为'diff'>0?diff:0)表示为dm2;所以我想用我已经计算过的别名'diff'替换第一个case,而不是再次计算(s2-s1)。。。
编辑:几周过去了。。。。但仍然没有答案,有人能帮忙吗?

kt06eoxx

kt06eoxx1#

回答您的第二个问题“是否可以在pig中为bincondition表达式使用别名?”我们不能在bicondition表达式中使用别名。这种情况不仅适用于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;

在这篇文章中,我们为 (s2-s1) 并在表达式中使用它。希望你觉得这个答案有用。谢谢您。

相关问题