mapreduce查找多个最大值

时间:2013-12-13 17:43:27

标签: mongodb pandas pymongo

尝试通过map_reduce了解如何执行此操作。目前,我发现将整个集合拉成一个大熊猫数据帧。那个df包含这样的东西:

project     ep     seq     shot     layers          totalframes
showA     sh18     17120     10     cnt_chr_set     128
showA     sh18     17040     70     shd_chr_set     288
showA     sh18        80    460     chr_rim         131
showA     sh18     17120     20     chr_vol_lgt     120
showA     sh18     17120     10     set_all         128
showA     sh18     17120     20     cnt_chr_set     120
showA     sh18     17120     20     cnt_chr_set     130
showA     sh18     17120     20     cnt_chr_set       3
showA     sh18     17120     20     cnt_chr_set       1
showA     sh18     17120     10     set_all_ani     128
showA     sh18     17120     20     set_all_ani     120
showA     sh18     17040     70     set_all         288
showA     sh18     17120     10     shd_chr_set     128
showA     sh18     17120     20     shd_chr_set     120
showA     sh18     18150     20     chr_ben_steam     3
showA     sh18     18150     20     chr_whi_steam     3
showA     sh18     18150     20     chr_bil_steam     3
showA     sh18     17040     70     chr_sal_steam   288

我真正需要做的是找到镜头每层的MAX总帧数。结果数据帧应仅包含每个图层中的一个用于镜头。例如:

showA     sh18     17120     20     chr_vol_lgt     120
showA     sh18     17120     20     cnt_chr_set     130
showA     sh18     17120     20     set_all_ani     120

我实际上只是想用熊猫来达到这一点,但看起来它的数据太多了。仅将我需要的信息从mongodb中拉到数据框中似乎是正确的方法,但我不知道从哪里开始使用map_reduce。

指针赞赏。

2 个答案:

答案 0 :(得分:1)

这里不需要MapReduce,很可能只使用聚合框架:

{ "$group" : { "_id" : { "l": "$layers",
                         "s": "$shots"
                       }, 
               "maxframes" : {"$max" : "$totalframes"}
} }

不确定您是否关心其他字段,如果是,您可以将它们添加到“_id”分组。如果重要,您可以使用$project重命名另一个阶段的字段。

答案 1 :(得分:0)

当你看一下你的数据表明它在SQL中是一个简单的“分组依据”时,map reduce可能是不必要的

我正在考虑一个聚合查询,大概是这样的:

{$group : {"_id" : "$layers", "max_totalframes" : {"$max" : "$totalframes"}}}

这应返回每个图层项目的最高总框架数。如果我正确地理解了您的问题,那就是您正在寻找的