首页 > 微信100亿条用户获取红包的数据,找出其中得到红包数最多的1000名用户,用什么方法比较好?

微信100亿条用户获取红包的数据,找出其中得到红包数最多的1000名用户,用什么方法比较好?

微信100亿条用户获取红包的数据,找出其中得到红包数最多的1000名用户,用什么方法比较好?


感觉大数据的本质就是分治算法,把大数据平分到单个节点(即机器)上,先算出一些结果,从而缩小数据量,然后汇聚到一个节点上,算出最优结果。面试的时候说一下你的思路就行,具体实现的话学一下hadoop或者spark就行。

比如我的一个想法就是:先把数据平均分到1000个节点上,每个节点上1000w数据,先扫描一遍数据,找出数据的最大最小值,然后平均分成1w个区间, 再扫一遍数据,获得数据分布的直方图。然后从取值最大的区间开始往后扫,如果第一个区间里面已经有1000+的数据,则停止;否则继续扫下一个区间,直到找到1000+的数据。当然,如果有一个区间里面数据特别多,可以对这个区间进一步细分,计算出该区间的子直方图,使用同样的方法扫数据。最后输出的结果应该是所有数据加上最大和最小值。这个阶段就是map阶段。
这些数据汇聚起来之后,应该会剩下差不多十几或者几十万数据,可以单机计算了,也就是reduce阶段。对汇聚的数据进行处理时,可以先用最大最小值进行区间比较,提高效率。当然,也可以直接用最大堆算法进行处理。

另外,如果剩下的数据较多,比如说100w+,可以重复上面的map方法,只要保证分到每个节点上的数据大于1000就行。

如果需要多次map处理,最好用spark的流式处理,hadoop比较适合一次map-reduce的操作。


这个用数据结构 二叉堆 之「最大堆」就可以了


学了这么久的排序算法,总于有用武之地了


在新增纪录的时候

就做记数

这样

就不用遍历了

避免100亿遍历的消耗


难道不是Hadoop Spark

【热门文章】
【热门文章】