我需要在 Pig 中选择表的前 x% 行。有人可以告诉我如何在不编写 UDF 的情况下做到这一点吗?
谢谢!
如前所述,首先您需要计算表中的行数,然后显然您可以这样做:
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
问题是,在 Pig 0.10 中引入了对函数的动态参数支持LIMIT
。如果您使用的是以前的版本,那么这里会使用该功能提供建议。TOP
不确定如何获取百分比,但如果您知道表大小为 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 中执行此操作,您需要运行一项工作来计算行数,然后执行 LIMIT 查询的另一项工作。
我不会写猪代码,因为编写和测试需要一段时间,但我会这样做(如果你需要确切的解决方案,如果没有,有更简单的方法):
计算每个分位数的数据点。
此时,前 10% 的最低点将落入这些区间之一。找到这个区间(这很容易,因为计数会准确地告诉你它在哪里),并使用较大分位数的计数总和与相关分位数一起找到这个区间中的 10% 点。
再次检查您的数据并过滤掉所有内容,除了比您刚刚找到的点大的点。
其中的一部分可能需要 UDF。