在过滤后使用猪组语法中的先前 table

Using previous table in pig group syntax after filter

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

为什么要引用过滤器前的table?我正在努力学习猪,但我发现自己经常犯这个错误。在我看来,t1_filtered 应该等于 table,它只是 t1 的过滤版本。因此,一个简单的组应该是有意义的,但我被告知您需要引用之前的 table。有谁知道幕后发生了什么以及为什么这是有道理的?另外,也感谢帮助命名这个问题。

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

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;

但是在某些情况下,您取消引用 (.) 的方式也适用。当您引用复杂数据类型(如地图、元组或包)时,您只能使用点 (.)。如果我们使用点运算符访问普通字段,它将期望标量输出。如果它有多个输出,那么您将收到类似这样的错误。

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 子句中使用任何取消引用运算符的原因。

希望这能回答您的问题。