以下是自定义的一个数据类型,有两个属性,一个是名称,一个是开始点(可以理解为单词和单词的位置)
MR程序就不写了,请看WordCount程序。
package cn.genekang.hadoop.mr.RealignerTargetCreator;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException; import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.io.WritableComparator; public class ReadBean implements WritableComparable<ReadBean> {
/**
* 自定义的一个数据类型。
* 此数据类型可以作为key,也可以作为value
* 如果只作为value的话而且不需要排序的话可以继承自Writable接口。如果需要排序的话就必须实现WritableComparable接口
* 如果作为key的话,还必须要指定以什么作为key,或者说需要告诉shuffle,你的key值是怎么进行比较的。
* 以此,必须要定义一个Comparator的比较类,继承自 WritableComparator,而且要有定义key的比较器
* **/
private String locName;
private int readStart; public ReadBean() {
// TODO Auto-generated constructor stub
} //必须重写此方法,将属性进行序列化处理
@Override
public void write(DataOutput out) throws IOException {
out.writeUTF(locName);
out.writeInt(readStart);
} //必须重写此方法,反序列化,得到属性的值
@Override
public void readFields(DataInput in) throws IOException {
this.locName = in.readUTF();
this.readStart = in.readInt(); } //此方法是重写Object类的,可以不重写
@Override
public int hashCode() {
return locName.hashCode() * 13 + readStart;
} //要想对数据进行排序,必须重写此方法。1为升序,-1为降序,0为相等
@Override
public int compareTo(ReadBean o) {
if (this.locName.equals(o.getLocName())) {
return this.readStart > o.readStart ? 1 : -1;
} else {
return this.locName.compareTo(o.locName) > 0 ? 1 : -1;
} } //必须要重写,指明自定义数据类型的输出格式和输出内容
@Override
public String toString() {
return this.locName +"\t"+ this.readStart;
} //可以不重写
public boolean equals(ReadBean o) { if (this.locName.equals(o.getLocName())
&& this.readStart == o.getReadStart()) { return true;
}
return false; } //可以使用此方法为自定义数据类型赋值。
public void set(String name, int start) {
this.locName = name;
this.readStart = start;
} public String getLocName() {
return locName;
} public void setLocName(String locName) {
this.locName = locName;
} public int getReadStart() {
return readStart;
} public void setReadStart(int readStart) {
this.readStart = readStart;
} //定义一个内部的比较类,实现key的比较方法
public static class Comparator extends WritableComparator {
public Comparator() {
super(ReadBean.class);
// TODO Auto-generated constructor stub
} @Override
public int compare(byte[] arg0, int arg1, int arg2, byte[] arg3,
int arg4, int arg5) {
return compareBytes(arg0, arg1, arg2, arg3, arg4, arg5);
} } //定义一个key的比较器
static {
WritableComparator.define(ReadBean.class, new Comparator());
} }

Hadoop-MapReduce之自定义数据类型的更多相关文章

  1. Hadoop MapReduce自定义数据类型

    一 自定义数据类型的实现 1.继承接口Writable,实现其方法write()和readFields(), 以便该数据能被序列化后完成网络传输或文件输入/输出: 2.如果该数据需要作为主键key使用 ...

  2. Hadoop MapReduce编程 API入门系列之自定义多种输入格式数据类型和排序多种输出格式(十一)

    推荐 MapReduce分析明星微博数据 http://git.oschina.net/ljc520313/codeexample/tree/master/bigdata/hadoop/mapredu ...

  3. hadoop的自定义数据类型和与关系型数据库交互

    最近有一个需求就是在建模的时候,有少部分数据是postgres的,只能读取postgres里面的数据到hadoop里面进行建模测试,而不能导出数据到hdfs上去. 读取postgres里面的数据库有两 ...

  4. mapreduce 自定义数据类型的简单的应用

    本文以手机流量统计为例: 日志中包含下面字段 现在需要统计手机的上行数据包,下行数据包,上行总流量,下行总流量. 分析:可以以手机号为key 以上4个字段为value传传递数据. 这样则需要自己定义一 ...

  5. [Hadoop] - Mapreduce自定义Counter

    在Hadoop的MR程序开发中,经常需要统计一些map/reduce的运行状态信息,这个时候我们可以通过自定义Counter来实现,这个实现的方式是不是通过配置信息完成的,而是通过代码运行时检查完成的 ...

  6. Hadoop(16)-MapReduce框架原理-自定义FileInputFormat

    1. 需求 将多个小文件合并成一个SequenceFile文件(SequenceFile文件是Hadoop用来存储二进制形式的key-value对的文件格式),SequenceFile里面存储着多个文 ...

  7. Hadoop mapreduce自定义分组RawComparator

    本文发表于本人博客. 今天接着上次[Hadoop mapreduce自定义排序WritableComparable]文章写,按照顺序那么这次应该是讲解自定义分组如何实现,关于操作顺序在这里不多说了,需 ...

  8. Hadoop mapreduce自定义分区HashPartitioner

    本文发表于本人博客. 在上一篇文章我写了个简单的WordCount程序,也大致了解了下关于mapreduce运行原来,其中说到还可以自定义分区.排序.分组这些,那今天我就接上一次的代码继续完善实现自定 ...

  9. hadoop自定义数据类型

    统计某手机数据库的每个手机号的上行数据包数量和下行数据包数量 数据库类型如下: 数据库内容如下: 下面自定义类型SimLines,类似于平时编写的model import java.io.DataIn ...

  10. Hadoop MapReduce执行过程详解(带hadoop例子)

    https://my.oschina.net/itblog/blog/275294 摘要: 本文通过一个例子,详细介绍Hadoop 的 MapReduce过程. 分析MapReduce执行过程 Map ...

随机推荐

  1. ASP.NET前端语法应用

    字符拼接 <%# "abc" + Eval("列名").ToString() %> <%# Eval("列名"," ...

  2. O_NONBLOCK模式下写fifo的注意事项

    后台网络通信框架一般采用fifo来作为事件通知的机制:创建一个fifo,然后以非阻塞读和非阻塞写的方式打开fifo,然后把fd加到epoll里面,作为通知网络事件的fd. 在这里有个隐晦的问题容易被忽 ...

  3. Shell数组

    #!/bin/bash#数组的使用#数组赋值方式:#1. user[index]=value index为0,1,2,3,4....数组下标值#2. user=(value0 value1 value ...

  4. 基于ECharts 的地图例子

      最近的一个项目要用到显示地图,本来用jq做了一个,但由于客户不满意(确实自己弄的样式效果都不是太理想),于是就上网搜了搜,最后决定基于百度的ECharts来弄地图 本来自己js基础不是很扎实,EC ...

  5. 查看 MySQL 数据库中每个表占用的空间大小

    TABLE_SCHEMA : 数据库名TABLE_NAME:表名ENGINE:所使用的存储引擎TABLES_ROWS:记录数DATA_LENGTH:数据大小INDEX_LENGTH:索引大小 SELE ...

  6. 可视化查看MongoDB - MongoVUE

    OS:Window 7 1.下载安装MongoVUE:http://www.mongovue.com/downloads/ 2.运行MongoVUE,点击“OK”按钮,使用免费版 3.选择一个已经存在 ...

  7. eclipse中DDMS的LOGcat只有一列level

    拷贝来源:http://www.cnblogs.com/kobe8/p/4620785.html http://stackoverflow.com/questions/25010393/eclipse ...

  8. 2014年度辛星html教程夏季版第二节

    上面一节中我们介绍了HTML文件的书写和几个标签,接下来我们来认识几个其他的标签,这里我们主要介绍一下head标签和文本标签. ***************head标签*************** ...

  9. shell编程的一些例子4

    bash支持一维数组 1.数组定义: name= (value1,value2...valueN) value形如[[subscript]=]string [subscript]= 是可选项  如果没 ...

  10. IT专业人士如何更有效的学习专业知识

    查看: http://www.cnblogs.com/suizhouqiwei/archive/2010/05/17/1737265.html 书:http://www.cnblogs.com/wxi ...