0

我需要在 Pig 中选择表的前 x% 行。有人可以告诉我如何在不编写 UDF 的情况下做到这一点吗?

谢谢!

4

3 回答 3

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

问题是,在 Pig 0.10 中引入了对函数的动态参数支持LIMIT。如果您使用的是以前的版本,那么这里会使用该功能提供建议。TOP

于 2012-10-03T07:45:49.710 回答
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 中执行此操作,您需要运行一项工作来计算行数,然后执行 LIMIT 查询的另一项工作。

于 2012-10-02T23:58:13.233 回答
0

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

  1. 从您的输入中获取样本。说几千个数据点左右。
  2. 对它进行排序并找到 n 个分位数,其中 n 应该是你拥有的 reducer 数量的某个顺序或稍大一些。
  3. 计算每个分位数的数据点。

  4. 此时,前 10% 的最低点将落入这些区间之一。找到这个区间(这很容易,因为计数会准确地告诉你它在哪里),并使用较大分位数的计数总和与相关分位数一起找到这个区间中的 10% 点。

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

其中的一部分可能需要 UDF。

于 2012-10-04T06:05:19.000 回答