我应该如何选择表格的前10%?

时间:2012-10-02 23:38:36

标签: hadoop apache-pig

我需要在Pig中选择表格的前x%行。有人可以告诉我如何在不编写UDF的情况下完成它吗?

谢谢!

3 个答案:

答案 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)

我不会写猪代码,因为它需要一段时间来编写和测试,但我会这样做(如果你需要确切的解决方案,如果没有,有更简单的方法):

  1. 从您的输入中获取样本。说几千个数据点左右。
  2. 对此进行排序,找到n个分位数,其中n应该是你所拥有的减速器数量级或某个更大的数量级。
  3. 计算每个分位数的数据点。

  4. 此时,前10%的最小点将落入其中一个区间。找到这个间隔(这很容易,因为计数会准确地告诉你它的位置),并且使用较大分位数的计数和相关分位数的总和在该区间内找到10%点。

  5. 再次检查您的数据并过滤掉除了您刚找到的点之外的所有内容。

  6. 部分可能需要UDF。