如何在猪的时间序列中计算

Posted

技术标签:

【中文标题】如何在猪的时间序列中计算【英文标题】:how to calculate at time series in pig 【发布时间】:2020-12-13 18:30:02 【问题描述】:

如果我写DUMP monthly,我会得到:

(Jan,2)
(Feb,102)
(Mar,250)
(Apr,450)
(May,590)
(Jun,790)
(Jul,1040)
(Aug,1260)
(Sep,1440)
(Oct,1770)
(Nov,2000)
(Dec,2500)

检查架构:

DESCRIBE monthly;

输出:

monthly: group: chararray,total_case: long

我需要计算每个月的增长率。因此,对于二月,它将是:

(total_case in Feb - total_case in Jan) / total_case in Jan = (102 - 2) / 2 = 50

三月份将是:(250 - 102) / 102 = 1.45098039

所以,如果我把记录放在monthlyIncrease,写DUMP monthlyIncrease,我会得到:

(Jan,0)
(Feb,50)
(Mar,1.45098039)
........
........
(Dec, 0.25)

猪有可能吗?我想不出任何办法来做到这一点。

【问题讨论】:

【参考方案1】:

可能。创建一个类似的关系说 b. 按月对两个关系进行排序。对两个关系 a、b 进行排序。加入 a.rank = b.rank + 1 然后进行计算。您必须合并 (Jan,0) 记录。

假设每月按组(月)排序

monthly = LOAD '/test.txt' USING PigStorage('\t') as (a1:chararray,a2:int);
a = rank monthly;  
b = rank monthly;   
c = join a by $0, b by ($0 + 1);  
d = foreach c generate a::a1,(double)((a::a2 - b::a2)*1.0/(b::a2)*1.0);  
e = limit monthly 1; 
f = foreach e generate e.$0,0.0; 
g = UNION d,f;
dump g;

结果

【讨论】:

我收到错误消息。检查日志文件后,我可以看到这个错误:ERROR 2017: Internal error creating job configuration。 org.apache.pig.impl.logicalLayer.FrontendException:错误 1066:无法打开别名 g 的迭代器 做了一个小改动,e generate e.$0 中缺少$0 基本上,我从这行dump c 得到了同样的错误。我想提一件事,而不是一月,二月,我的记录中的月份数是字符串(chararray)格式,例如,'01' 代表一月,'02' 代表二月。我希望,与此无关为错误。 @user1896653 我已经更新了脚本并附上了结果。如果它有助于投票/标记为答案

以上是关于如何在猪的时间序列中计算的主要内容,如果未能解决你的问题,请参考以下文章

在 Pig 中使用 Hcat Loader 访问在 Hive 中创建的视图

如何在猪中读取json数据?

如何在猪中使用 rcfilepigstorage

如何在猪脚本中对单行中的字段进行总计?

如何在猪拉丁语的日期时间范围内创建缺失的记录

如何从猪的字符串中替换'$'?