如何在 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 个键进行汇总操作:productcountry

    我使用productcountry 进行连接操作 我必须计算价格,在 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 中进行“总结”?的主要内容,如果未能解决你的问题,请参考以下文章

如何优化 PIG latin 中的 group by 语句?

如何使用 Pig Latin 从 AWS S3 加载数据

何时不使用 Pig Latin

Pig Latin 中不区分大小写的搜索

使用 PIG Latin 加载 XML

用 Pig Latin 为每组编写一个文件