Hadoop 数据类型及序列化
1.Hadoop数据类型
Java类型 | Hadoop Writable类型 |
---|---|
Boolean | BooleanWritable |
Byte | ByteWritable |
Int | IntWritable |
Float | FloatWritable |
Long | LongWritable |
Double | DoubleWritable |
String | Text |
Map | MapWritable |
Array | ArrayWritable |
Null | NullWritable |
2.为何Hadoop有自身序列化与反序列化
- Java自身的序列化除去本身Bean的数据外,携带了各种校验信息、头及继承体系等,本身比较重,Hadoop自身的序列化则仅携带了轻量的简单校验信息,因此可以达到集群之间存储空间少、传输速度快的特性。
- 自身实现的序列化可以实现在不同的开发语言下互相之间序列/反序列,更好的互操作性。
3.自定义Hadoop序列/反序列 Bean类型
- 必须实现Writable接口
- 反序列化时,需要反射调用空参构造函数,所以必须有空参构造函数
public FlowBean(){
super();
}
- 重写序列化方法
/**
* 序列化方法
* @param dataOutput
* @throws IOException
*/
@Override
public void write(DataOutput dataOutput) throws IOException {
dataOutput.writeLong(upFlow);
dataOutput.writeLong(downFlow);
dataOutput.writeLong(sumFlow);
}
- 重写反序列化方法
/**
* 反序列化方法
* 注意,反序列化时数据的顺序必须和序列化时的顺序完全一致
* @param dataInput
* @throws IOException
*/
@Override
public void readFields(DataInput dataInput) throws IOException {
upFlow = dataInput.readLong();
downFlow = dataInput.readLong();
sumFlow = dataInput.readLong();
}
- 要想把结果显示在文件中,需要重写toString(),可用\t分开,方便后续使用。
@Override
public String toString() {
return "FlowBean{}";
}
- 如果需要将自定义的Bean放在key中传输,则还需要实现Comparable接口,因为MapReduce框架中的Shuffle过程要求对key必须能排序。
@Override
public int compareTo(FlowBean o) {
return this.sumFlow > o.getSumFlow() ? -1 : 1;
}
完整代码如下
package cn.coreqi.mapreduce.writable;
import org.apache.hadoop.io.Writable;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
/**
* 1.定义类实现 Writable 接口
* 2.重写空参构造函数
* 3.重写序列化和反序列化方法
* 4.toString()方法
* 5.如果自定义的Bean需要放在key中传输,则还需要实现Comparable接口
*/
public class FlowBean implements Writable,Comparable<FlowBean>{
private long upFlow; //上行流量
private long downFlow; //下行流量
private long sumFlow; //总流量
public long getUpFlow() {
return upFlow;
}
public void setUpFlow(long upFlow) {
this.upFlow = upFlow;
}
public long getDownFlow() {
return downFlow;
}
public void setDownFlow(long downFlow) {
this.downFlow = downFlow;
}
public long getSumFlow() {
return sumFlow;
}
public void setSumFlow(long sumFlow) {
this.sumFlow = sumFlow;
}
public void setSumFlow() {
this.sumFlow = this.upFlow + this.downFlow;
}
/**
* 空参构造函数
*/
public FlowBean(){
super();
}
/**
* 序列化方法
* @param dataOutput
* @throws IOException
*/
@Override
public void write(DataOutput dataOutput) throws IOException {
dataOutput.writeLong(upFlow);
dataOutput.writeLong(downFlow);
dataOutput.writeLong(sumFlow);
}
/**
* 反序列化方法
* 注意,反序列化时数据的顺序必须和序列化时的顺序完全一致
* @param dataInput
* @throws IOException
*/
@Override
public void readFields(DataInput dataInput) throws IOException {
upFlow = dataInput.readLong();
downFlow = dataInput.readLong();
sumFlow = dataInput.readLong();
}
@Override
public String toString() {
return upFlow + "\t" + downFlow + "\t" + sumFlow;
}
@Override
public int compareTo(FlowBean o) {
return this.sumFlow > o.getSumFlow() ? -1 : 1;
}
}
作者:奇
出处:https://www.cnblogs.com/fanqisoft/p/17899740.html
版权:本作品采用「本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2019-12-13 使用TypeScript创建Vue项目