PIG Group by 避免包

Posted

技术标签:

【中文标题】PIG Group by 避免包【英文标题】:PIG Group by avoid Bag 【发布时间】:2017-10-12 01:41:03 【问题描述】:

这是一个基本的 PIG 问题。 我的数据是这样的

10  | Dog
15 | Cow
20 | Dog
15 | Elephant
15 | Dog
25 | Elephant

我想找到每只动物的平均重量并得到如下输出:

Dog | 12.5
Elephant | 20
Cow | 15

我可以使用 GROUP by 并得到结果,但结果是一个袋子,像这样:

 (Dog), (Dog)  | 12.5
 (Elephant), (Elephant) | 20
 (Cow) | 15

我怎样才能只提取单个动物?

我正在像这样使用 GROUP by。

--animal_weight is derived through other means
animal_by = GROUP animal_weight by (animal);
results = FOREACH animal_by GENERATE animal_weight.animal as animal_name, AVG(animal_weight.weight) as kg;
STORE results INTO '$output_4' USING PigStorage('|');

【问题讨论】:

【参考方案1】:

使用group 而不是animal_weight.animal。请注意,根据您的样本数据,狗的平均体重应为 (10+20+15)/3 = 15 公斤

results = FOREACH animal_by GENERATE group as animal_name, AVG(animal_weight.weight) as kg;

输出

【讨论】:

谢谢!我刚想出 12.5,应该算一下 :-)

以上是关于PIG Group by 避免包的主要内容,如果未能解决你的问题,请参考以下文章

使用带有 SUM 和 GROUP BY 的完整 JOIN 避免重复条目

在 sql 查询中使用聚合函数时避免 group by 子句

SQL - 避免额外的 GROUP BY(并提高查询性能)

为啥 DISTINCT 在 Pig 中比 GROUP BY/FOREACH 快

Pig 脚本在 group by 语句中挂起

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