过滤后使用pig组语法中的上一个表

时间:2015-10-15 00:31:30

标签: apache-pig

假设我在猪的桌子上有3列,a,b,c。现在假设我想通过b == 4过滤表,然后将其分组。我相信这看起来像这样。

t1 = my_table; -- the table contains three columns a, b, c
t1_filtered = FILTER t1_filtered by (
   b == 4
);
t1_grouped = GROUP t1_filtered by my_table.a;

我的问题是为什么它看起来不像这样:

t1 = my_table; -- the table contains three columns a, b, c
t1_filtered = FILTER t1_filtered by (
   b == 4
);
t1_grouped = GROUP t1_filtered by t1_filtered.a;

为什么必须在过滤器之前引用该表?我正在努力学习猪,我发现自己犯了很多错误。在我看来,t1_filtered应该等于一个只是t1的过滤版本的表。因此,一个简单的小组应该有意义,但我已经告诉你需要从之前引用该表。有谁知道幕后发生的事情以及为什么这有意义?另外,也欢迎帮助命名这个问题。

1 个答案:

答案 0 :(得分:0)

取消引用(。)的方式也不正确。这应该是这样的。

A = LOAD '/filepath/to/tabledata' using PigStorage(',') as (a:int,b:int,c:int);
B = FILTER A BY a==1;
C = GROUP B BY a;

但是你的解除引用方式(。)在某些情况下也会起作用。在引用复杂数据类型(如map,tuple或bag)时,只能使用点(。)。如果我们使用点运算符来访问正常字段,它会期望标量输出。如果它有多个输出,那么你会得到类似的错误。

java.lang.Exception: org.apache.pig.backend.executionengine.ExecException: ERROR 0: Scalar has more than one row in the output. 1st : (1,2,3), 2nd :(2,2,2)

使用点运算符的方式只有在group by的输出只有一个输出时才有效,否则你最终会得到这个错误。关系B不是复杂的数据类型,这是我们在group by子句中不使用任何解除引用运算符的原因。

希望这能回答你的问题。