我需要在Pig中选择表格的前x%行。有人可以告诉我如何在不编写UDF的情况下完成它吗?
谢谢!
答案 0 :(得分:3)
如前所述,首先需要计算表格中的行数,然后显然可以这样做:
A = load 'X' as (row);
B = group A all;
C = foreach B generate COUNT(A) as count;
D = LIMIT A C.count/10; --you might need a cast to integer here
问题是,dynamic argument support for LIMIT
function was introduced in Pig 0.10。如果您使用的是先前版本,则a suggestion is offered here使用TOP
功能。
答案 1 :(得分:0)
不确定如何提取百分比,但如果你知道你的表格大小是100行,你可以使用LIMIT命令获得前10%的例子:
A = load 'myfile' as (t, u, v);
B = order A by t;
C = limit B 10;
(以上示例改编自http://pig.apache.org/docs/r0.7.0/cookbook.html#Use+the+LIMIT+Operator)
至于动态限制为10%,不确定你可以在不知道桌子有多大的情况下做到这一点,而且我很确定你不能在UDF中做到这一点,你需要运行一个job计算行数,然后另一个作业进行LIMIT查询。
答案 2 :(得分:0)
我不会写猪代码,因为它需要一段时间来编写和测试,但我会这样做(如果你需要确切的解决方案,如果没有,有更简单的方法):
计算每个分位数的数据点。
此时,前10%的最小点将落入其中一个区间。找到这个间隔(这很容易,因为计数会准确地告诉你它的位置),并且使用较大分位数的计数和相关分位数的总和在该区间内找到10%点。
再次检查您的数据并过滤掉除了您刚找到的点之外的所有内容。
部分可能需要UDF。