Hadoop MR 分区(partition)和全排序(WritableComparable)_writablecomparable排序(区内排序)-程序员宅基地

技术标签: mapreduce  Hadoop  hadoop  大数据  

一、概念

1、分区:
Hadoop默认分区是根据key的hashCode对ReduceTask个数取模得到的,用户无法控制哪个key存储到哪个分区。

   想要控制哪个key存储到哪个分区,需要自定义类继承Partitioner<KEY, VALUE>,
   泛型KEY, VALUE分别对应Mapper里的输出key,value,因为分区是在map()之后,环形缓冲区溢写时完成的。
    提示:如果ReduceTask的数量大于自定义类中重写的getPartition()设置的分区数时,会产生空的输出
    		文件part-r-00000
       如果ReduceTask的数量小于自定义类中重写的getPartition()设置的分区数时,有一部分分区
       数据无处安放,就会报错
       如果ReduceTask的数量等于1,则不会走自定义的分区方法,系统默认分区就是1,最终只会输出
       一个分区文件
       分区号必须从0开始,逐一增加
2、全排序:
最终输出结果只有一个文件,且文件内部有序。实现方式是只设置一个ReduceTask。但该方法在处理大型文件时
效率极低,因为一台机器处理所有文件,完全丧失了MapReduce所提供的并行架构。

二、项目举例

1、待处理文本 :data.txt
武汉市	20	男	王五
黄石市	90	男	卢洪河
武汉市	60	女	王喜
黄石市	80	男	赵存福
黄石市	50	男	陈新华
孝感市	30	女	新华源
武汉市	80	男	齐五
孝感市	80	男	齐五
孝感市	23	男	罗修运
武汉市	10	女	赵易 
武汉市	25	男	武六七
孝感市	25	男	袁灿裕
武汉市	60	男	武庚
黄石市	60	男	张永军
黄石市	60	男	吴理阳
孝感市	33	男	邓喜潮
孝感市	30	男	廖相俭
武汉市	45	女	赵琪
武汉市	55	女	李真
孝感市	30	男	蒋结万
黄石市	50	男	刘志斌
武汉市	45	男	李志
孝感市	5	男	袁帅
武汉市	70	女	赵雅
孝感市	40	男	张军
黄石市	60	男	吴扬
武汉市	55	女	真贾
孝感市	30	男	蒋一万

2、需求:

分别统计出各市感染人员信息,输出到对应文件中(说明:武汉的人员信息统一输出到一个文件,十堰的人员信息
统一输出到一个文件),
    输出结果按照感染人员的年龄做倒叙排列。输出结果举例:
    地区 姓名 年龄 性别  
     武汉  张三  70   女
	   武汉  李四   50   男
     武汉  王五   60   女 
     武汉  赵六   55   男

3、PersonBean.java

import org.apache.hadoop.io.WritableComparable;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;

public class PersonBean implements WritableComparable<PersonBean> {
   
    
    private String area; // 感染地区
    private String name; // 感染姓名
    private Integer age; // 感染年龄
    private String sex; // 感染性别

    public PersonBean() {
   
    
    }

    @Override
    public String toString() {
   
    
        return area + "\t" + name + "\t" + age + "\t" + sex;
    }

    public String getArea() {
   
    
        return area;
    }

    public void setArea(String area) {
   
    
        this.area = area;
    }

    public String getName() {
   
    
        return name;
    }

    public void setName(String name) {
   
    
        this.name = name;
    
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_46122692/article/details/109138875

智能推荐

尤瓦尔·赫拉利不懂人工智能?_专访尤瓦尔赫拉利-程序员宅基地

文章浏览阅读822次。https://www.toutiao.com/a6684036824584684044/2019-04-26 11:16:36​如果您也想和尤瓦尔·赫拉利探讨人工智能、人类历史、机器算法等议题,欢迎留言。美国时间2019年4月22日,人工智能理论家尤瓦尔·赫拉利和计算机科学教授李飞飞博士,展开了一场【人工智能巨变和人工智能的人性化】的硬核对话,并揭示了人工智能技术快速..._专访尤瓦尔赫拉利

xpath之string(.)方法-程序员宅基地

文章浏览阅读4.7k次,点赞2次,收藏8次。from lxml import etreehtml = ''' <li class="tag_1">需要的内容1 <a>需要的内容2</a> </li>'''selector = etree.HTML(html )contents = selector.xpath ( '//li[@class = ..._xpath('string(.)')

股指期货对冲策略_方差最小目标化股指期货的最优对冲-程序员宅基地

文章浏览阅读2.1k次。Alpha 对冲背景作为普通的投资者,大部分投资者都会选择基金这一投资渠道。而面对眼花缭乱的基金产品,投资者如何选择出符合自己风险偏好的基金就显得十分重要。这一选择的过程可能就需要我们对基金产品做一个绩效评价,选出其中表现最好的作为我们的投资组合。而最常见的三个评价标准有下述三个:1、夏普 (Sharpe) 指数:美国经济学家威廉•夏普于 1966 年发表《共同基金的业绩》一文,提出用基金承担单位总风险(包括系统风险和非系统风险)所带来的超额收益来衡量基金业绩,这就是夏普指数。夏普指数通过一定评价_方差最小目标化股指期货的最优对冲

linux获取网卡名称_linux如何知道socket套接字连接的网卡名称-程序员宅基地

文章浏览阅读4.7k次。#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;#include &lt;unistd.h&gt;#include &lt;sys/socket.h&gt;#include &lt;netinet/in.h&gt;#include &lt;string.h&gt;#include &lt;net/if.h&gt;#include &a_linux如何知道socket套接字连接的网卡名称

matlab怎么载入视频,怎样将视频导入matlab啊-程序员宅基地

文章浏览阅读2.3k次。1、用matlab读取avi 视频(只能读一定压缩各式的avi 电影,这是因为avi视频文件的编码有很多,而matlab只支持部分编码格式。可见http://blog.csdn.net/IdoIwill/article/details/2125838) aviinfo('d:\abc.avi');%显示存在d 盘文件abc.avi 的信息,在matlab2010 版本中,该函数可以换成mmread..._matlab怎么导入视频文件

kali更新apt-get upgrade报错_kali docker安装apt-update报错-程序员宅基地

文章浏览阅读419次。在kali中安装docker时,一直报错,在执行更新apt-upgrade时报错,报错内容如下。报错信息中很明显的一个报错信息就是数字签名校验失败。_kali docker安装apt-update报错

随便推点

雷达点云数据.pcd格式转.bin格式_点云pcd转bin文件-程序员宅基地

文章浏览阅读788次,点赞8次,收藏9次。注意,方法1原则上可行,但是本人没整好pypcd的环境方法2是利用open3d的环境,基于python3.7绝对可以的_点云pcd转bin文件

html界面缩放_html页面根据页面大小缩放怎么设置-程序员宅基地

文章浏览阅读1.4k次。【代码】html界面释放。_html页面根据页面大小缩放怎么设置

基于STM32单片机智能台灯路灯红外人体感应光照蓝牙设计19-117-程序员宅基地

文章浏览阅读148次。19-117、基于STM32单片机智能台灯路灯红外人体感应光照无线APP设计+蓝牙控制设计产品功能描述:本设计由STM32F103C8T6单片机核心板电路+红外传感器电路+光敏电阻电路+高亮LED灯电路+蓝牙模块+拨动开关+电源电路组成。一、通过拨动开关选择系统工作模式:模式1:拨动开关拨上。1、当有人的时候,天越亮,灯越暗,天越暗,灯越亮。2、如果无人,则灯自动熄灭。模式2:拨动开关拨下。1、可以通过手机蓝牙APP控制灯的亮灭。

一.求生之路2服务器的搭建(Windows)_srcds-程序员宅基地

文章浏览阅读4.9w次,点赞9次,收藏22次。下载游戏1.先去下载个在服务器上下载游戏的工具.(服务器不用安装Steam客户端)所以要借助这个工具SteamCMD下载steamCMD的网站 直接下载steamCMD的压缩包2.解压出来 3.新建一个文件,改名字为 *.bat , 如DownloadUpdateGame.bat,前面什么的不重要,重要是的后缀为.bat 这个是用来下载和更新游戏的,会自动补全缺失的游戏文件 4.用记事本打_srcds

QTableWidget控件总结-程序员宅基地

文章浏览阅读51次。1,设置QTableWidget滚动条宽度。myTableWidget->verticalScrollBar()->setStyleSheet("QScrollBar:vertical { width: 100px; }");QTableWidget详解(样式、右键菜单、表头塌陷、多选等) (2013-05-15 09:24:53)转载▼标..._qtablewidget控件自绘

python中获得字符串s长度的方法是什么_获得字符串s长度的方法是什么?【 】(8.0分)_学小易找答案...-程序员宅基地

文章浏览阅读2.1k次。【名词解释】多功能酶【填空题】维生素B6包括______、______、______三种物质【判断题】Python是一种开源、免费的高级动态编程语言。 (5.0分)【简答题】请写出程序运行后显示结果(8分) def f(a,b,op): print(eval(a+op+b)) x = '5678' y = '1234' z = '%+-*' for a,b,op in zip(x,y,z): f(..._python中获得字符串 s长度的方法是: