hadoop之分组

    分组组件:map-----分组-----reduce reduce接收到的数据是按照map输出的key进行分组的
分组的时候按照key相同的为一组 实现writablecomparable接口 comparato
comparato返回为 0的时候默认为一组 返回不为0 则分到下一组
如果你想要的分组并不是key中的所有字段 这个时候怎么办
年级:3年级3班 3年级2班 只想要年级字段 自定义分组
分组说白了就是比较的过程 按照key比较 只要返回0的就会认为1组 如果不返回0 就滑到下一组
例如:求出每门课程参考学生成绩最高平均分的学生的信息:课程,姓名和平均分
这道题要求的好就是分组求最大值 两件事情:分组 排序(shuffle)
要想在map到reduce中间的过程中进行排序 得以排序字段为key
map端发出的key:分数
你如果以分数为key造成的结果:相同的分数调用一次reduce 58 英语/计算机/数学
实际需求求得是没门课程平均分最高的
我的需求中相同的科目需要分到一组
map输出的key:科目
map输出的key应该是谁?如果是科目 怎么求最大值 reduce进行求 这是最佳方案吗?
最佳方案是map发出的key:科目+分数
排序:分数
分组:科目分
如果能做到这个效果就可以求出需求了
如果以科目和分数作为key 必然会造成一个问题:相同科目和相同分数的会到一组中 默认
这个时候我们就不可以使用默认的
自定义分组规则
分析:mapreduce中:
map:拆课程 分数 封装为对象(自定义排序) 作为key发送
value:姓名
reduce中:已经分好组(自定义) 排好序的
如果按照自定义的分组来:
相同课程为一组,并且这一组数据按照分数进行好了排序 倒序
public class MyGroup extends WritableComparator{
//用于比较实现了WritableComparable的类 的实例 按照课程进行分组
@Override
public int compare(WritableComparable a, WritableComparable b) {
ScoreBean asb=(ScoreBean)a;
ScoreBean bsb=(ScoreBean)b;
//之关系返回0的值
return asb.getCourse().compareTo(bsb.getCourse());
}
}
结果文件:
实际上分组组件 有作用 但是 分组位置不对 现在的结果排好序之后进行的分组
现在看到效果 排序在前 分组在后
实际想要的结果 是分好组之后进行排序
在map到reduce过程中 会默认的先进行排序 在进行分组
===========================
computer 83.2
computer 83.0
===========================
math 83.0
===========================
english 83.0
===========================
math 82.28571428571429
===========================
algorithm 82.28571428571429
algorithm 82.0
===========================
computer 74.42857142857143
===========================
english 74.42857142857143
===========================
algorithm 74.42857142857143
===========================
math 74.42857142857143
===========================
algorithm 72.75
===========================
math 72.75
===========================
computer 72.42857142857143
===========================
english 72.42857142857143
===========================
math 72.42857142857143
===========================
computer 72.42857142857143
===========================
math 69.28571428571429
===========================
english 69.28571428571429
===========================
computer 65.25
computer 65.0
===========================
english 64.18181818181819
===========================
computer 64.11111111111111
===========================
algorithm 62.142857142857146
===========================
english 62.142857142857146
===========================
computer 62.142857142857146
===========================
english 59.57142857142857
english 56.0
===========================
math 56.0
===========================
algorithm 56.0
===========================
computer 56.0
===========================
english 55.0

最终结果:
computer 83.2
computer 83.0
computer 74.42857142857143
computer 65.25
computer 65.0
如果想要这个结果:排序阶段将分组字段纳入排序范围
排序的字段:先按课程 再按分数
当既有分组又有排序的时候:排序在前分组在后
排序字段一定要包含分组字段
实际上的分组仅仅是将map输出的结果 相邻的进行比较,仅仅会比较前一条数据和后一条数据
如果相同返回为1组 如果不相同重新划分组
如果我们想要分组一定要能保证分组字段的数据在相邻的位置
排序:A B C
分组:D F
最终实际排序字段:D F A B C 为了保证相同的分组数据相邻
分组的字段:D F
实际中分组的字段一定是排序字段的前几个
排序:A B C
分组: A AB ABC
sql:topN求解 最最常见的问题

reduce函数中的两个坑:
1)Iterable values 只能循环遍历一次 指针的 每次循环遍历完成指针都会移动到最后一个
2)迭代器中所有对象公用同一个地址 //

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;

import org.apache.hadoop.io.WritableComparable;

/**
 * 自定义分组和排序使用的对象
 * 作为map输出的key
 * 
 * @author Administrator
 *
 */
public 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值