1.中位数与标准差计算示例【内存优化】
在前一篇博客中,我介绍了一种计算中位数和标准差的方法,但是该方法需要将所有的数据读入内存再进行遍历,不够优化。所以在这里,我们将前一种方法进行优化,
将所有的数值都插入列表会产生大量的重复的元素。一个规避重复元素的方法就是保存元素的计数。
例如:要保存<1,1,1,1,2,2,3,4,5,5,5>可以使用排序好的值到计数的映射来代替:(1->4,2->2,3->1,4->1,5->3).
核心概念还是与前一种方法相同,但是这样可以减少存放到内存的数据量。而且这个方法还有一个优点就是可以使用combiner来聚合map端的计数。
2.数据集
本示例使用Movielens数据集中的u1.base文件,MovieLens数据集是一个用户对电影的评分数据集,在后续的示例中我们将一直使用这个数据集,我会将这个数据集上传到优快云方便大家下载,文件的格式如下所示:
第1列到第4列分别代表用户ID**,项目ID**,用户对项目的评分,时间戳
1 1 5 874965758
1 2 3 876893171
1 3 4 878542960
1 4 3 876893119
1 5 3 889751712
1 7 4 875071561
1 8 1 875072484
... .... ....
943 1067 2 875501756
943 1074 4 888640250
943 1188 3 888640250
943 1228 3 888640275
943 1330 3 888692465
3.问题
对于给定的用户项目评分数据,确定每个用户评分的中位数、均方差。
4.计算方案(内存优化版)
1)自定义Writab类存储输出数据
public class MedianStdDevImproveTuple implements Writable{
private float stdD