我试图根据列动态限制关系中包中元组的数量。
所以,这就是我想要做的事情:
--tmp_data: {user_id: bytearray, book: chararray, hotness: double,cnt: long}
grp2 = GROUP tmp_data BY (user_id,cnt);
final_data = FOREACH grp2 {
sorted = order tmp_data by user_id asc,hotness desc;
top1 = LIMIT sorted cnt;
GENERATE FLATTEN(top1);
};
专栏" cnt"是我想要向用户显示的先前计算的书籍数量。因此,我按用户分组并计算,并与
建立分组关系grp2: {group: (user_id: bytearray,cnt: long),tmp_data: {(user_id: bytearray,book: chararray,hotness: double,cnt: long)}}
这样我就可以根据每个用户的数量限制书籍数量。
但由于某种原因,它不起作用。 它给了我这个奇怪的错误:
ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1066: Unable to open iterator for alias final_data. Backend error : org.apache.pig.backend.executionengine.ExecException: ERROR 0: Exception while executing [PORelationToExprProject (Name: RelationToExpressionProject[bag][*] - scope-19518 Operator Key: scope-19518) children: null at []]: java.lang.RuntimeException: Unable to evaluate Limit expression: NULL
如果我使用常数,它可以正常工作,但它不像我上面描述的那样。 我使用0.11并且我读到我们可以在LIMIT操作中使用常量。
我也试过
top1 = LIMIT sorted (int)cnt;
top1 = LIMIT sorted tmp_data.cnt;
top1 = LIMIT sorted tmp_data::cnt;
--and with no sorting
top1 = LIMIT tmp_data cnt;
但没有任何效果。
请帮忙。 感谢。
答案 0 :(得分:1)
Pig文档明确指出,您不能使用LIMIT运算符的输入关系中的任何列。要么它应该是常数,要么是标量。在您的情况下,您使用的是cnt,它是输入关系中的一列。