首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PIG:计算每个文章的wiki页面计数数据请求的最高月度增长率

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

Stack Overflow用户
提问于 2016-04-20 00:45:42
回答 1查看 123关注 0票数 4

我有几个来自https://dumps.wikimedia.org/other/pagecounts-raw/2015/的维基转储数据,现在我想计算2015年每个维基文章的每月请求增长,然后找出文章请求增长最高的月份,以及增长有多高……解释:维基数据的格式为:"wikiproject“”文章-url“”请求数“”页面大小(字节)“,例如: fr.b Special:Recherche/Achille_Baraguey_d%5C%27Hilliers 1624 en Main_Page 242332 4737756101

我们的集群设置仍在“进行中”,所以我必须在数据集较小的cloudera quickstart VM上试用它。我只使用了3个月中1个小时的页面转储...然而,当我尝试演示它时,它耗尽了JAVA堆空间,或者我得到了消息GC重载……

这是我的代码:

代码语言:javascript
复制
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中是否可以为二进制条件表达式使用别名?例如:c= FOREACH b生成组,((s2-s1) as 'diff‘>0?diff: 0)作为dm2;所以我想用我已经计算过的别名'diff‘替换第一个案例,而不是再次计算(s2-s1) ...

编辑:一些星期已经过去了....还是没有答案,有人能帮上忙吗?

EN

回答 1

Stack Overflow用户

发布于 2016-05-18 12:43:31

回答你的第二个问题“在pig中可以为二进制条件表达式使用别名吗?”我们不能在expression.This中使用别名,不仅仅是猪,在SQL中我们也不能使用它。我们不能为没有(=)赋值运算符的表达式提供别名。

如果您确实希望避免重复使用表达式,请执行以下操作

代码语言:javascript
复制
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)创建了另一个别名为diff的列,并在表达式中使用它。希望这个答案对你有用。谢谢。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36724557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档