使用 Python 和 Hadoop Streaming 查找 Top-K

Finding Top-K using Python & Hadoop Streaming

所以我有一个以前作业的这种格式的输出文件(.txt 文件)

"   145
"Defects,"  1
"Information    1
"Plain  2
"Project    5
"Right  1
#51302] 1
,000) 1
&   3
'AS-IS',    1
(   1
("the   1

每行左边是我从文档中读到的单词,每行右边的数字是我数过的次数。我想创建另一个 map reduce 作业,使用 Python & Hadoop Streaming 来查找前 k 个值。在这种情况下,假设为 5。我无法想象映射器应该做什么。

我应该解析每一行并将每个单词附加到列表中吗?然后,我会从这些列表中获取前 k 个值并将其发送到 reducer 吗?然后 reducer 读取所有这些列表并且 returns 只读取前 k 个值?如果有人可以通过伪代码提供一些建议,或者如果我在错误的道路上纠正我,我们将不胜感激。谢谢!

您几乎走在正确的轨道上。将您的单词视为映射器任务的键,将计数视为值。如果在您的输入文件中,您可以获得相同单词和不同计数的多个条目,那么您无法从中取出前 K 个。然后你必须聚合数据然后找出前 K 。这将在 reducer 中完成。由于 reducer 应接收同一个键的所有数据,它可以聚合完整的数据并取出前 K。但是必须有另一个链式 map reduce 来找出所有记录中的前 K,你应该有 1 个 reducer查找顶部元素。

但是如果你的输入文件有一个键的条目一次,你可以只从所有映射器发出前 K 个,然后将它发送到 1 个 Reducer 以从所有映射条目中找出前 K 个。