[toc]

一.分区

问题:按照条件将结果输出到不同文件中

自定义分区步骤

1.自定义继承Partitioner类,重写getPartition()方法

2.在job驱动Driver中设置自定义的Partitioner

3.在Driver中根据分区数设置reducetask数

分区数和reducetask关系

案例实操

将统计结果按照手机归属地不同省份输出到不同文件中(分区),手机号136、137、138、139开头都分别放到一个独立的4个文件中,其他开头的放到一个文件中

(1)自定义分区类

MyPartitioner.class

import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Partitioner; public class MyPartioner extends Partitioner<Text, FlowBean> {
@Override
public int getPartition(Text text, FlowBean flowBean, int numPartitions) {
String phone = text.toString();
if (phone.startsWith("136")) {
return 0;
} else if (phone.startsWith("137")) {
return 1;
} else if (phone.startsWith("138")) {
return 2;
}else if (phone.startsWith("139")){
return 3;
}else {
return 4;
}
}
}
(2)在Driver类设置分区和reducetask数
//设置自定义partitioner
job.setPartitionerClass(MyPartioner.class);
//设置reducetask数量
job.setNumReduceTasks(5);

二.全排序、分区排序、分组

当自定义的对象作为key,按照指定条件进行排序

实现排序的2种方式

1.对象实现WritableComparable接口

实现WritableComparable接口,重写compareTo方法,就可以实现排序(二次排序)

public class OrderBean implements WritableComparable<OrderBean> { 

    //自定义排序,先按pid升序,再按pname降序
@Override
public int compareTo(OrderBean o) {
int compare = this.pid.compareTo(o.pid);
if (compare == 0) {
return -this.pname.compareTo(o.pname);
}
return compare;
}
}
2.继承WritableComparator类

自定义比较器继承WritableComparator类,父类构造方法增加需要比较的Bean对象,

//继承WritableComparator类
public class MyGroupCompartor extends WritableComparator { public MyGroupCompartor(){
//增加Bean对象
super(OrderBean.class,true);
}
// 对Bean的排序方法
@Override
public int compare(WritableComparable a, WritableComparable b) {
OrderBean oa = (OrderBean) a;
OrderBean ob = (OrderBean) b;
return oa.getPid().compareTo(ob.getPid());
}
}

全排序

不分区,只有一个reducetask,针对Key进行排序

分区排序

针对key全排序,然后针对key进行分区

辅助排序【自定义分组】

分析:已经对key进行排序,比如key对象为OrderBean的排序是id,pname的二次排序

,在进入reduce()的分组希望是id相同的进入一组,那么就需要自定义分组针对id进行分组

OrderBean
id pname amount
1 小米
1 2400
1 1500
2 华为
2 2400
2 3400
自定义分组比较器

MyGroupCompartor.class

import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.io.WritableComparator; public class MyGroupCompartor extends WritableComparator { public MyGroupCompartor(){
super(OrderBean.class,true);
} @Override
public int compare(WritableComparable a, WritableComparable b) {
OrderBean oa = (OrderBean) a;
OrderBean ob = (OrderBean) b;
return oa.getPid().compareTo(ob.getPid());
}
}
在Driver类中声明自定义分组
job.setGroupingComparatorClass(MyGroupCompartor.class);

最新文章

  1. 八大排序算法Java
  2. 作业八—Alpha阶段项目总结
  3. solr多条件查询(三)
  4. Nopcommerce主要的技术
  5. Windows部署WordPress
  6. 使用mongo-java-driver3.0.2.jar和mongodb3.0在java代码中的用户验证4
  7. Codeforces Round #311 (Div. 2) D. Vitaly and Cycle 图论
  8. Zedboard VmodCAM PIN Constraint
  9. SQL语句查询数据库的触发器、存储过程、视图以及表的SQL语句
  10. Hibernate_01
  11. LeetCode(48)-Length of Last Word
  12. H5活动页开发有关
  13. 微信小程序爬坑
  14. ubuntu系统下手动安装autoconf安装包
  15. pytorch使用不完全文档
  16. 洛谷P1073 最优贸易
  17. 背水一战 Windows 10 (102) - 应用间通信: 剪切板
  18. STM32——C语言知识点:指针、结构体
  19. 关于windows内存的一些简单看法
  20. Jquery ajax 数据更新

热门文章

  1. 0x04
  2. Linux下的 sniff-andthen-spoof程序编写
  3. java随手记 基础
  4. feign微服务调用携带浏览器信息(header、cookie)
  5. linux下安装Git并生成SSH key
  6. go微服务框架Kratos笔记(一)入门教程
  7. Handler处理器&amp;&amp;使用代理服务器urllib.request.ProxyHandler
  8. 调用企业微信API拨打紧急通知电话
  9. win10的pycharm中安装ansible模块过程
  10. [bzoj1232]安慰奶牛