三 概要模式 1)数值概要 (单词计数\记录计数\最大值/最小值/计数\平均值、中位数、标准差)...

  数值概要
    模式描述:
        数值概要模式是计算机数据聚合统计值的一般性模式。  对于合理使用 combiner 以及理解正在做的计算来讲,数值概要模式是极为重要的。
    目的
        基于某个键将记录分组并对每个分组计算一系列的聚合值,从而得到较大数据集高层次视图
     适用场景
        要处理的数据是数值数据或者计数
        数据可以按照特定的字段进行分组
            如: 用户登录网站、输入查询、执行其他特定操作。广告在不同时间段的效果 
                    以上所有问题都可以通过计算数据集 数值概要得到高层次视图来解答
        对很多数值概要函数来说, combiner 可以极大减少通过网络传输到 reduce 端的中间键/值 对的数据量。 也就是满足 结合律 交换律
        很多数值概要函数通过定制 partitioner 来实现更优的将 K/V 对发送到 n 个 reduce 任务。  如果启动100 个reduce 任务, 其中 80% 任务30S 完成。而其余20个任务用了20分钟的话,那么效率就不高。像这种任务的执行时间要求很高,数据量非常大,且存在数据倾斜的情况,定制 partitioner 将是非常有必要的解决方案。
        已知应用:
            单词计数                        : 对每一个单词输出其内容和总计次数。
            记录计数                        : 对特定的时间间隔(天,周,每小时等)计算数据每个周期内的数据流速
            最大值/最小值/计数        :如 用户第一次发表评论时间,最后一次发表评论时间或指定时间段评论数目。
            平均值、中位数、标准差:由于这些操作不满足结合律,因此实现起来没有那么直接,这三者都可以使用 combiner, 但与之前简单的重复使用 reduce 实现不同,需要使用更为复杂的方式达到目标。

        平均值因为这两个计算是不满足结合律的,所以不能像之前那样轻松的得到 combiner 的益处。中位数是将数据集分成搞和低两部分的那个数值,这要求数据集是完整的 并且是混排过的。 同事数据必须是经过排序的。
             平均值 map 计算代码 (如图: 将相同键相加计数与值 得到单个map 的平均数。 reduce 阶段将所有map 计数与平均值相乘 在重新得到 平均值。)



标准差(Standard Deviation)
标准差也被称为标准偏差,或者实验标准差,公式为  
 
意义:标准差是一组数据平均值分散程度的一种度量。一个较大的标准差,代表大部分数值和其平均值之间差异较大;一个较小的标准差,代表这些数值较接近平均值。
例如,两组数的集合 {0,5,9,14} 和 {5,6,8,9} 其平均值都是 7 ,但第二个集合具有较小的标准差。
说人话等于:将所有集合的值 遍历 相加减去平均值,它的平方和除以数的个数(或个数减一),再把所得值开根号,就是1/2次方,得到的数就是这组数的标准差。
代码就是   
如果是单点的话可以用写好的算法工具类来实现,不过在集群计算中, 需要灵活的拆分可能需要自己写一些方便操作的工具类了。
标准差可以当作不确定性的一种测量。例如在物理科学中,做重复性测量时,测量数值集合的标准差代表这些测量的精确度。当要决定测量值是否符合预测值,测量值的标准差占有决定性重要角色:如果测量平均值与预测值相差太远(同时与标准差数值做比较),则认为测量值与预测值互相矛盾。这很容易理解,因为如果测量值都落在一定数值范围之外,可以合理推论预测值是否正确。
标准差应用于投资上,可作为量度回报稳定性的指标。标准差数值越大,代表回报远离过去平均数值,回报较不稳定故风险越高。相反,标准差数值越小,代表回报较为稳定,风险亦较小。
百度link:
 

        内存优化版的中位数标准差
            减少内存使用量。将每一个数值插入到一个列表中会产生大量的重复元素。一个规避重复数据的方法是保存元素的技术。例如:要保存《1,1,1,1,2,2,3,4,5,5,5》 这样的一个map。 可以使用排序好的值到计数的映射来代替(1-4,2-2,3-1,5-3 )。 combiner 可以用来聚合 map 端的计数,并映到一个 Writable 对象 供后续的 reduce 使用。
              对于有 N 条评论的列表计算每个评论长度出现多少次,原有方法需要存储空间为 O(N)  ,M是最大评论长度。采用映射之后 k/v 对的数量为 O (max(m))。  combiner 可以用来聚合 map 端的评论长度计数,并输出映射到一个 Writable 对象供后续的 reduce 使用。

              问题:  给定一个用户评论列表,确定其一天中每个小时的评论长度的中位数和标准差。
            mapper 代码:
                mapper 的处理需要计算按天每小时评论长度中位数的输入记录。输出键是一天的小时值,输出值是一个 SortedMapWritable 对象,包含一个元素: 评论长度 和 一个计数“1”。 这个映射将在 combiner 和 reduce 中多次使用。
                    rg.apache.hadoop.io包中,有4个Writable集合类:ArrayWritable,TwoDArrayWritable 是对Writable的数组和两维数组的实现,它们中所有元素必须是同一类的实例。MapWritable和SortedMapWritable。分别实现了java.util.Map和java.util/OsrtedMap。每个键/值字段使用的类型是相应字段序列化形成的一部分。类型存储为单个字节(充当类型数组的索引)。在org.apache.hadoop.io包中,数组经常与标准类型结合使用,而定制的Writable类型也通常结合使用,但对于非标准类型,则需要在包头中指明所使用的数组类型。根据实现,MapWritable类和SortedMapWritable类通过正byte值来指示定制的类型,所以在MapWritable和SortedMapWritable实例中最多可以使用127个不同的非标准Wirtable类。
            reduce 代码:
                   reduce 代码遍历给定的  SortedMapWritable 集合并将所有的映射聚合到一个 SortedMap 实现的 TreeMap 数据结构中。  键是长度,值是对应这个评论长度的全部计数。
                         中位数: 通过遍历,计算出 中位数,通过将全部评论数的综合除以2作为查找中位数的列下标。  previousCommentCount <= medianIndex < commentCount。  
                        标准差: 接下来通过遍历 TreeMap 来找出平方的总和。  中位数和标准差作为值与评论被发出的小时时间作为键一起被输出。
              combiner 优化:
                        这个算法的 combiner 实现与 reduce 不同。 reduce 需要计算中位数 和 标准差 ,而 combiner 对每个本地 map 的中间 k/v 聚合 SortedMapWritable 条目。考虑到这不需要做排序 并且 HashMap 有较高的新能,因此选择 HashMap 代替 TreeMap。 reduce 需要使用评论长度到技术的映射来计算中位数和标准差。而 combiner 使用SortedMapWritable 来序列化其输出以供 reduce 阶段使用。























转载于:https://www.cnblogs.com/rocky24/p/e7afd5afb84b6b78a9f3090a3155f65b.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值