计算Map / Reduce中的排名

时间:2011-08-27 00:42:39

标签: hadoop couchdb

我有一个在SQL中很难解决的简单问题,我想知道它是否可以在map-reduce系统中完成。

我想制作排名。想象亚马逊购买数据库(简化)

ORDERS
ISBN  copies_purchased
AAAA   5
AAAA   1
BBBBB  3
BBBBB  4
CCCC   3

我想制作排名表

rank ISBN     copies_purchased
1    BBBB     7
2    AAAA     6
3    CCCC     3

map-reduce到计算的copies_purchased是显而易见的;计算排名不那么重要,至少对我而言。

(这不是一个家庭作业问题。我需要这个用于我的实际工作。这样更好吗?)

修改 我认为这可以从标题,标签和问题的文本中看出来,但这是一个SQL问题。我想知道如何在map / reduce中做到这一点。是的,我有数百万行。好吧,可能是数十亿。

4 个答案:

答案 0 :(得分:1)

在CouchDB中,map / reduce构建一维索引,以便沙发可以通过密钥快速找到任何信息。

首先,正如您所说,map / reduce非常容易构建copies_purchased视图。但关键空间是ISBN ID,它是你关心的,但它们没有特别的顺序。

对于小型应用程序,人们只需获取整个数据集并在内存中进行排序。如果你了解自己的要求,这是一个很好的捷径。但它没有扩展。

可扩展的解决方案是将这些行放入自己的数据库中。 second map / reduce可以从copies_purchased发出密钥,并将值返回到ISBN。 (不需要减少步骤。)

Key                 Value
copies_purchased    ISBN

7                   BBBB
6                   AAAA
3                   CCCC

您可以获取前N行,或者您可以通过查询?skip=6&limit=1找到排名第七的书

答案 1 :(得分:0)

如果排名由销售的副本数决定,那么您可以使用sql select游标构建该表:

select * from ORDERS orderby copies_purchased desc

然后根据您检索记录的顺序分配排名

while (nextRecord) currRecord.rank = i++;

答案 2 :(得分:0)

我不确定如何使用couchdb执行此操作。据我所知,没有办法直接将couchdb数据读入hadoop。我所知道的最接近的是Brisk,它结合了hadoop和cassandra。它也是免费的。

或者,如果它不必是最新的,您可以将相关数据转储到文本或序列文件,并将它们用作输入。

我认为你必须分两步完成这项工作。首先,生成购买的副本,这基本上是与hadoop相同的单词计数示例。

由于您可以通过查看所购买的副本的输出(这本身可能是一项工作)来相对轻松地找到所购买的最大副本数,因此您可以创建一个自定义分区程序,根据以下内容划分产品购买的副本。因此,如果您有3个减速机,并且您销售的最大数量为600个副本,那么减速机1的产品销售量为0 - 200份,减速机2的产品销售量为201 - 400,减速机3的产品销售量为401 - 600份。然后,您可以合并已排序的reducer输出文件,然后销售已排序的副本列表。

或者对于源代码,请查看terasort基准代码here。有关Terasort classes here的更多信息。

所以最终得到的工作流程如下:

  1. 计算每件产品销售份数的工作
  2. 根据上一个作业的输出找到销售数量最多的作业(尽管您可以跳过此步骤,具体取决于您实施排序的方式。)
  3. 对数据进行排序并为您提供已售出的产品副本的排序列表的作业。可能会输出多个文件,因此您可能需要一个简单的脚本将它们合并在一起。
  4. 有关管理此类多步骤工作流程的帮助,请查看OozieCascading

    有关排序的更多信息,请参阅this answer

答案 3 :(得分:-3)

除非你有数百万行,否则很容易在SQL中解决。

SELECT ISBN,count(*)FROM orders GROUP BY ISBN ORDER BY 2 desc;