在filter之后使用pig组语法中的前一个表

yc0p9oo0  于 2021-06-24  发布在  Pig
关注(0)|答案(1)|浏览(564)

假设我有一个pig表,有3列,a,b,c。现在假设我想按b==4过滤表,然后按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 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;

为什么必须在筛选之前引用表?我在学Pig,我发现自己经常犯这个错误。在我看来,t1\u filtered应该等于一个表,它只是t1的过滤版本。因此,一个简单的组应该是有意义的,但是我被告知您需要引用以前的表。有人知道幕后发生了什么吗?为什么这么做有意义?另外,帮助命名这个问题也很感激。

9q78igpj

9q78igpj1#

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

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 条款。
希望这能回答你的问题。

相关问题