我有一个在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中做到这一点。是的,我有数百万行。好吧,可能是数十亿。
答案 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的更多信息。
所以最终得到的工作流程如下:
有关管理此类多步骤工作流程的帮助,请查看Oozie或Cascading。
有关排序的更多信息,请参阅this answer。
答案 3 :(得分:-3)
除非你有数百万行,否则很容易在SQL中解决。
SELECT ISBN,count(*)FROM orders GROUP BY ISBN ORDER BY 2 desc;