假设输入 x
记录, n
其中有一个期望的属性(例如,它们的值是正的)和所有 x
有唯一的钥匙。
我想做的是,使用mapreduce中的map-only作业,精确地发射 k
其中之一 n
记录。
例如,假设这是我的输入:
(a, 10)
(g, -3)
(c, -2)
(f, 4)
(s, 2)
我想发射两个正数的元素。在这个例子中 x
是5, n
是3和 k
是2。我知道 x
(我认为这是不必要的), k
以及 n
在作业开始之前。问题是,具有正值的记录可以由不同的Map器处理。
我想到的是,使用一个大小相同的哈希表 n
在每个Map器中,使用键的哈希值将具有正值的元素放入此哈希表中。然后,第一个 k
哈希表的位置将被释放。但是,如果两个记录落在同一个散列桶中,这将不起作用。有别的选择吗?
1条答案
按热度按时间thigvfpy1#
有一种方法可以通过一个只Map的作业和一点顺序代码来实现,但是这是一种非常粗糙的方法,而且在大多数情况下,使用一个减缩器更简单。
在更正式的语言中,您需要执行一个过滤器(sqlwhere)和一个select(sqllimit)。过滤器可以并行化,而select不能,除非你想采用概率方法。
其思路如下:
在“仅Map”作业中,您可以根据选择标准筛选数据。
您还可以跟踪有关在Map器中过滤了多少条记录的元信息。
把这个数字写进共享文件系统中的一个文件,我猜是hdfs。以任务id或输出文件名加上一些后缀命名文件。
3.
应该在文件系统中生成一堆可以读取的元文件,以及相应的Map输出。然后贪婪地读一个新的元文件,直到你达到你的目标k
. 如果在一个Map输出/元文件中有更多的记录,可以删减输出文件(或者告诉下一个文件它只需要读取)y
“溢出”文件中的记录)。