我试图在基于列的关系中动态限制包中的元组数。
所以,这就是我要做的:
--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,在极限运算中可以用常数。
我也试过了
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;
但什么都没用。
请帮忙。谢谢。
1条答案
按热度按时间vs3odd8k1#
pig文档清楚地表明,不能使用带有限制运算符的输入关系中的任何列。它应该是常量或标量。在您的例子中,您使用的是cnt,它是输入关系中的一列。