从mapreduce中的n个元素中选择k

时间:2014-08-08 10:10:23

标签: algorithm hadoop hash parallel-processing mapreduce

假设x条记录的输入,n具有所需的属性(例如,它们的值为正),并且所有x都具有唯一的密钥。

我想要做的是,在MapReduce中使用仅限地图的作业,会准确发出这些k条记录中的n条。

例如,假设这是我的输入:

(a, 10)
(g, -3)
(c, -2)
(f, 4)
(s, 2)

我希望准确地发出2个具有正值的元素。在此示例中,x为5,n为3,k为2.我知道x(我认为不需要),k和{ {1}}在工作开始之前。 问题是具有正值的记录可以由不同的映射器处理。

我所想到的是,在每个映射器中使用大小为n的散列表,并使用键的散列将具有正值的元素放入此散列表中。然后,将发出哈希表的第一个n位置中的元素。但是,如果两个记录属于同一个哈希桶,则无法使用。任何替代方案?

1 个答案:

答案 0 :(得分:1)

有一种方法可以使用仅限地图的作业和一些顺序代码来执行此操作,但是在大多数情况下使用减速器更简单。

在一种更正式的语言中,你想要做一个过滤器(sql where)和一个select(sql限制)。过滤器可以并行化,除非您想要采用概率方法,否则选择无法进行。

这个想法如下:

  1. 在仅限地图的作业中,您可以根据您的选择标准过滤数据。
  2. 您还会跟踪有关您在映射器中过滤了多少条记录的元信息。
  3. 将此号码写入共享文件系统中的文件,我想你的情况下是HDFS。在任务标识或输出文件名加上一些后缀后命名文件。
  4. 3.应该在您的文件系统中产生一堆元文件,您可以使用它们相应的地图输出来阅读。然后贪婪地阅读一个新的元文件,直到你到达k。如果你在地图输出/元文件中有更多的记录,你可以修剪输出文件(或告诉接下来只需要从那个"溢出"文件中读取y记录的任何内容