如何在 Pig Latin 中进行“总结”?
Posted
技术标签:
【中文标题】如何在 Pig Latin 中进行“总结”?【英文标题】:How to do 'Summarizing' in Pig Latin? 【发布时间】:2013-10-25 08:52:04 【问题描述】:我正在尝试对 pig 进行汇总操作。
例如,我有一个名为t3
的表:
product price country
A 5 Italy
B 4 USA
C 12 France
A 5 Italy
B 7 Russia
我需要使用 2 个键进行汇总操作:product
和 country
。
-
我使用
product
和country
进行连接操作
我必须计算价格,在 CONCAT
结果重复的地方总结价格值
如果CONCAT
结果不重复,价格与t3
表中的价格保持一致。
预期的输出可能是:
CONCAT Price_1
AItaly 10
BUSA 4
CFrance 12
BRussia 7
在 pig 我写了以下脚本(代码是错误的,但只是为了说明一个想法):
t3 = LOAD '/home/Desktop/3_table/3_table.data' AS (product:chararray, price:int, country:chararray);
c1 = FOREACH t3 GENERATE CONCAT(product, country);
c2 = FOREACH t3 GENERATE *, c1;
product_1 = GROUP c2 BY c1;
price_1 = FOREACH product_1 GENERATE group, SUM(product_1.price);
STORE price_1 INTO 'summarise_by_2_ID' USING PigStorage('\t');
也许有人可以解释如何达到预期的结果? 提前非常感谢!
【问题讨论】:
【参考方案1】:如果您想计算每个产品和国家/地区的总和,则不需要使用 concat 函数。只需按这两个字段分组即可。
A = LOAD 's.txt' USING PigStorage('\t') AS (product:chararray, price:int, country:chararray);
B = GROUP A BY (product, country);
C = FOREACH B GENERATE CONCAT(group.product,group.country), SUM(A.price);
其实这里不需要concat,只是按预期格式化输出。
DUMP C
(AItaly,10)
(BUSA,4)
(BRussia,7)
(CFrance,12)
【讨论】:
我能再问一件事吗?如果我需要“分类”同一张桌子。预期结果可能是:A (A, 5, Italy), (A, 5, Italy) 2 B (B, 4, USA), (B, 7, Russia) 2 C (C, 12, France) 1 The CODE : t2 = LOAD '/home/Desktop/2_table/2_table.data' AS (product:chararray, price:int, country:chararray); A = 按产品分组 t2; C = FOREACH A GENERATE 组 $1, COUNT($1);使用 PigStorage('\t'); 将 C 存储到“分类”中;但是我收到一个错误,猪不喜欢 $1 的区别。有没有其他方法可以定义第一个元素:(A, 5, Italy), (A, 5, Italy),所以我可以数 A 重复 2 次? 我不明白你想做什么,但这样的事情可能会有所帮助:C = FOREACH A GENERATE group, $1, COUNT($1);
返回:(A,(A,5,Italy),(A,5,Italy),2) (B,(B,4,USA),(B,7,Russia),2) (C,(C,12,France),1)
谢谢,想法很相似!但是有什么方法可以将输出连接到 LOAD 中使用的原始表?以上是关于如何在 Pig Latin 中进行“总结”?的主要内容,如果未能解决你的问题,请参考以下文章