在猪中使用过滤器和分组依据

Posted

技术标签:

【中文标题】在猪中使用过滤器和分组依据【英文标题】:using filter and group by in pig 【发布时间】:2017-02-21 18:50:18 【问题描述】:

我是 pig 语法的新手,想知道是否有人可以提供将这段 SQL 代码翻译成 pig 的提示。

SELECT column1, column2, SUM(column3)
FROM table
WHERE column5 = 100
GROUP BY column2;

到目前为止我有:

data = LOAD....etc.
filterColumn = FILTER data BY column5 = 100;
groupColumn = Group filterColumn By column2;
result = foreach groupColumn Generate group, column1, SUM(column3) as sumCol3; 
DUMP result; 

这不起作用。错误消息是“无法将 org.apache.pig.builtin.SUM 的匹配函数推断为多个匹配或都不匹配。请使用显式强制转换。”

【问题讨论】:

你能分享示例输入和预期输出吗? 【参考方案1】:

SUM():计算单列包中数值的总和。它期望 bag 作为其输入。所以,FOREACH ... GENERATE 将是,

result = foreach groupColumn Generate group, filterColumn.column1, SUM(filterColumn.column3) as sumCol3; 

同样在FILTER 语句中,使用== 来检查相等性

filterColumn = FILTER data BY column5 == 100;

【讨论】:

我忘记指定 SUM 中 column3 的来源。 SUM(filterColumn.column3) @a.m.是的..希望这能解决,请您接受答案!【参考方案2】:

可以使用以下猪命令:

test=LOAD '<testdata>' USING PigStorage(',') AS (column1:<datatype>, column2:<datatype>,column3:<datatype>, column5:<datatype>);

A =FILTER test BY column5==100;

B = GROUP A BY column2;

C = FOREACH B GENERATE group, test.column1,test.column2,SUM(test.column3);

dump C;

注意“PigStorage”和“AS”的使用是可选的。

希望这会有所帮助。

【讨论】:

以上是关于在猪中使用过滤器和分组依据的主要内容,如果未能解决你的问题,请参考以下文章

在猪中使用 AvroStorage()

如何在猪中使用 rcfilepigstorage

在猪中增加映射器

无法在猪中处理 Xml

无法在猪中打开别名的迭代器

在猪中解析复杂的json?