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

Hadoop 我应该如何选择表格的前10%?,hadoop,apache-pig,Hadoop,Apache Pig,我需要在Pig中选择表的顶部x%行。有人能告诉我不写UDF怎么做吗 谢谢 不确定如何提取百分比,但如果知道表格大小为100行,可以使用LIMIT命令获取前10%的百分比,例如: A = load 'myfile' as (t, u, v); B = order A by t; C = limit B 10; (以上示例改编自) 至于动态限制为10%,不确定在不知道表有多大的情况下是否可以这样做,我很确定在UDF中不能这样做,您需要运行一个作业来计算行数,然后再运行另一个作业来执行限制查询。不确

我需要在Pig中选择表的顶部x%行。有人能告诉我不写UDF怎么做吗


谢谢

不确定如何提取百分比,但如果知道表格大小为100行,可以使用LIMIT命令获取前10%的百分比,例如:

A = load 'myfile' as (t, u, v);
B = order A by t;
C = limit B 10;
(以上示例改编自)


至于动态限制为10%,不确定在不知道表有多大的情况下是否可以这样做,我很确定在UDF中不能这样做,您需要运行一个作业来计算行数,然后再运行另一个作业来执行限制查询。

不确定如何获取百分比,但如果您知道表格大小为100行,则可以使用LIMIT命令获取前10%的数据,例如:

A = load 'myfile' as (t, u, v);
B = order A by t;
C = limit B 10;
(以上示例改编自)


至于动态限制为10%,我不确定在不知道表有多大的情况下是否可以这样做,我很确定在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

问题是。如果使用的是以前的版本,则使用
TOP
功能。

如前所述,首先需要计算表中的行数,然后显然可以执行以下操作:

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

问题是。如果您使用的是以前的版本,则使用
TOP
函数。

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

  • 从您的输入中获取样本。比如说几千个数据点左右
  • 对其进行排序,然后找到n个分位数,其中n应该在你拥有的减数器数量的某个地方,或者更大一些
  • 计算每个分位数的数据点

  • 在这一点上,前10%的最小值将落入其中一个区间。找到这个间隔(这很容易,因为计数会准确地告诉您它在哪里),然后使用较大分位数的计数和相关分位数,找到这个间隔中的10%点

  • 再次检查你的数据,过滤掉所有的东西,除了比你刚找到的更大的点


  • 这部分可能需要UDF。

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

  • 从您的输入中获取样本。比如说几千个数据点左右
  • 对其进行排序,然后找到n个分位数,其中n应该在你拥有的减数器数量的某个地方,或者更大一些
  • 计算每个分位数的数据点

  • 在这一点上,前10%的最小值将落入其中一个区间。找到这个间隔(这很容易,因为计数会准确地告诉您它在哪里),然后使用较大分位数的计数和相关分位数,找到这个间隔中的10%点

  • 再次检查你的数据,过滤掉所有的东西,除了比你刚找到的更大的点


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

    如果它值得投反对票,我应该知道这个问题的明显答案是什么。如果你愿意的话,我会尊重你。我不是落选的选民,但我坚信这是正确的选择:谢谢你的指点,但我可以回答我所做的一切。事实上,老实说,我似乎比下面回答的那个好人更了解这个问题(他在声誉方面有很多观点),这在我的评论中得到了证明。坦白地说,我以前在这个网站上见过类似的傲慢行为。假设短问题是愚蠢的是令人讨厌的。此外,寻找中间值是一个开放的问题,人们试图用启发式的方法来做。从某种意义上说,这个问题与那个问题类似。但无论如何,谢谢你对我的回应表示尊重。如果它值得投反对票,我有权知道这个问题的明显答案是什么。如果你愿意的话,我会尊重你。我不是落选的选民,但我坚信这是正确的选择:谢谢你的指点,但我可以回答我所做的一切。事实上,老实说,我似乎比下面回答的那个好人更了解这个问题(他在声誉方面有很多观点),这在我的评论中得到了证明。坦白地说,我以前在这个网站上见过类似的傲慢行为。假设短问题是愚蠢的是令人讨厌的。此外,寻找中间值是一个开放的问题,人们试图用启发式的方法来做。从某种意义上说,这个问题与那个问题类似。但无论如何,谢谢你对我的回应表示尊重。很少见。您可以使用组ALL来计算记录数,然后在FOREACH中进行后续计数。我不知道如何从那里开始。此外,将计数和数据包传递给UDF也很简单。我想说的是,如果不先采取(您和@Chihat)建议的步骤预先定位数据井,我认为您无法在UDF中完成所有这些。您可以使用组ALL来计算记录数,然后在FOREACH中进行后续计数。我不知道如何从那里开始。此外,将计数和数据包传递给UDF也很简单。我想说的是,如果不先采取(由您和@Chihat)建议的步骤来预先定位dataC,我认为您不可能在UDF中完成这一切,对吧(即使它只有一条记录)?我不知道它是怎么工作的。我运行了它,发现有些记录丢失了。C是一包元组(可以转换为标量)。只要打电话给
    description
    ,自己看看就可以了。如果您有
    null
    COUNT
    不会对其进行计数,请使用
    COUNT_