`

hadoopWritable接口常见数据类型-自定义数据类型-序列化

 
阅读更多

 

0 Java序列化反序列化概念:

 

JVM把数据写到JVM管理范畴之外, 然后将这些数据读回来放在JVM管理范畴内时,

需要一些处理才能被识别,写出去就是序列化,读取回JVM管理范畴内就是反序列化

 

0.1 Java序列化的不足


1.不精简。附加Java序列化的不足:
1.不精简。附加信息多。不大适合随机访问。
2.存储空间大。递归地输出类的超类描述直到不再有超类。序列化图对象,反序列化时为每个对象新建一个实例。相反。Writable对象可以重用。
3.扩展性差。而Writable方便用户自定义信息多。不大适合随机访问。

4. 总结一句话:

   Java的序列化是面向对象 有继承关系,就是将这个对象是祖宗十八代全给序列化和反序列化,很费空间

 

 

0.2 Hadoop序列化的特点

 

紧凑:高效使用存储空间。
快速:读写数据的额外开销小
可扩展:可透明地读取老格式的数据
互操作:支持多语言的交互

 

0.3 Hadoop序列化在分布式环境中的作用

 

进程间通讯,永久存储

Hadoop节点间通信

 

 

0.4 Hadoop序列化鼻祖Writable:

 

Writable接口, 是根据 DataInput 和 DataOutput 实现的简单、有效的序列化对象.
MR的任意Key和Value必须实现Writable接口.

 

public interface Writable {
	void write(DataOutput out) throws IOException;
	void readFields(DataInput in) throws IOException;
}


public interface WritableComparable<T> extends Writable, Comparable<T> {
}

 

 

0.5 常见的Writable实现类:

 



 


0.6 java类型和hadoop类型相互转化:

 

  java--->hadoop hadoop--->java
String new LongWritable(123L); get()
非String new Text(String str) toString()


 

0.7 java 基本类型和hadoop Writable实现类对比图:

 

 

 

 

hadoop是做大数据的,为何这么吝啬于简洁版本的序列化??

正是因为操作大数据,数据之间从map节点到reduce节点传输时,才要更小的开销IO流。

以达到快速的目的。

 

 

1 Hadoop自定义类型:

 

class KpiWritable1 implements Writable{
      因为操作的是流,先写入的就要先读出来	
	long upPackNum; // 上传数据包个数
	long downPackNum;// 下载数据包个数
	long upPayLoad;// 上传数据
	long downPayLoad;// 下载数据

	public KpiWritable1(String upPackNum,String downPackNum,String upPayLoad,String downPayLoad){
		this.upPackNum = Long.parseLong(upPackNum);
		this.downPackNum = Long.parseLong(downPackNum);
		this.upPayLoad = Long.parseLong(upPayLoad);
		this.downPayLoad = Long.parseLong(downPayLoad);
	}
	
	public KpiWritable1(){}
	
	@Override
	public void write(DataOutput out) throws IOException {
		// 先写后读
		out.writeLong(this.upPackNum);
		out.writeLong(this.downPackNum);
		out.writeLong(this.upPayLoad);
		out.writeLong(this.downPayLoad);
	}

	@Override
	public void readFields(DataInput in) throws IOException {
		// 读取的时候, 按照写方法的顺序( 队列方式) 顺序读取
		this.upPackNum = in.readLong();
		this.downPackNum = in.readLong();
		this.upPayLoad = in.readLong();
		this.downPayLoad = in.readLong();
	}
	
	@Override
	public String toString() {
		return upPackNum + "\t" + downPackNum + "\t" + upPayLoad + "\t" + downPayLoad;
	}
}


 

 

 

 2 Writable接口实现类查看源码

   发现 都是基本类型的比较

 

 

LongWritable:

 /** Compares two LongWritables. */
  @Override
  public int compareTo(LongWritable o) {
    long thisValue = this.value;
    long thatValue = o.value;
    return (thisValue<thatValue ? -1 : (thisValue==thatValue ? 0 : 1));
  }


Text:  mr处理中文的时候 使用u8方式  文字以binarybytes比较

/**This class stores text using standard UTF8 encoding. ...*/

 public class Text extends BinaryComparable
    implements WritableComparable<BinaryComparable> {

protected CharsetDecoder initialValue() {
      return Charset.forName("UTF-8").newDecoder().  	
 
 
 ArrayWritable 里面是对数组的封装 
 NullWritable 输入和写出方法都是空

 

 

 

Text:  mr处理中文的时候 使用u8方式  文字以binarybytes比较

 

 

  • 大小: 85.2 KB
  • 大小: 30.3 KB
分享到:
评论

相关推荐

    MapReduce模型--自定义数据类型

    自定义数据类型必须实现WritableComparable接口,这个接口是Hadoop中用于序列化和比较数据的接口。实现了WritableComparable接口的类,不仅可以将对象写入到Hadoop的数据流中,还能在MapReduce框架中比较这些对象,...

    Unity-自定义协议序列化和反序列化

    4. 遍历对象:在编写序列化和反序列化代码时,需要遍历对象的所有字段,并根据协议将其转换为适当的数据类型。这通常涉及到反射,但为了提高效率,可以考虑使用预编译的表达式树或者属性访问器。 三、自定义...

    flinkcdc-mysql自定义反序列化器.pdf

    自定义反序列化器需要实现DebeziumDeserializationSchema接口,负责将SourceRecord转换为自定义的数据格式。在本例中,我们将实现一个自定义的反序列化器,用于处理MySQL的数据。 首先,我们需要import相关的依赖项...

    Castor (二) -- 自定义映射

    - **类型转换**:定义如何将Java数据类型转换为XML数据类型,反之亦然,例如日期格式的转换。 - **命名空间处理**:如果XML文档包含命名空间,需要在映射文件中声明和处理。 - **集合和数组映射**:处理Java集合类...

    16、MapReduce的基本用法示例-自定义序列化、排序、分区、分组和topN

    总结,MapReduce提供了强大的工具来处理大规模数据,包括自定义序列化以适应各种数据类型,通过排序、分区和分组优化数据处理流程,以及使用TopN算法挖掘数据中的热点信息。理解并掌握这些基本用法对于开发高效、...

    易语言自定义数据类型变量保存

    它可能是易语言中一个用于序列化自定义数据类型的工具,将复杂的数据结构转换为可存储的格式,如文本文件或二进制文件。序列化是将程序中的对象状态转换为可以存储或传输的形式的过程,反序列化则是相反的过程,将...

    C#自定义序列化ISerializable的实现方法

    总的来说,C#中的自定义序列化通过ISerializable接口提供了对序列化过程的精细控制,允许开发者处理复杂的数据结构和特定的需求。这在处理如数据库持久化、网络传输或XML配置文件等场景时非常有用。但是,需要注意的...

    c# 自定义序列化两种方法

    在C#编程中,自定义序列化是一种将对象的状态转换为可存储或可传输的数据格式,然后能够将这些数据恢复为原始对象的过程。这在数据持久化、网络传输或者跨进程通信等场景中非常常见。本文将详细介绍两种C#中实现...

    Gson解析之自定义序列化和反序列化

    本篇文章将深入探讨如何在使用Gson时进行自定义的序列化和反序列化,以及在遇到后端返回的数据类型与预期不符时的处理策略。 ### Gson自定义序列化 自定义序列化主要是为了在转换Java对象为JSON时,根据特定需求...

    day3.基本数据类型-序列.md

    day3.基本数据类型-序列.md

    Excel数据整理与分析-自定义格式导入.pptx

    1. **数据类型认知**:Excel中的数据主要分为文本型和数字型。文本型数据包括姓名、地址、电话号码等,它们无法进行数学运算。数字型数据则可以进行加减乘除等运算,如销售量、价格等。 2. **单元格格式设置**: -...

    ch15-自定义数据集.zip

    对于自定义数据集,我们可能需要编写代码来生成或读取数据,比如从数据库、文件或网络接口获取。`tf.data` API是TensorFlow用于构建高效数据管道的关键模块,它允许我们方便地构建复杂的数据流水线。 在强化学习中...

    实例解析Json反序列化之ObjectMapper(自定义实现反序列化方法)

    在实际开发中,自定义反序列化方法是一种常见的需求。为了实现这一点,ObjectMapper允许开发者注册自定义的反序列化器(JsonDeserializer),以便对特定类型的字段进行特殊处理。这在处理复杂的数据结构或者需要进行...

    Flink 数据类型与序列化.pdf

    在Flink中,数据类型定义了数据在系统中流动和处理的格式,而序列化则涉及到这些数据类型在传输和存储时的编码和解码机制。Flink支持多种数据类型,包括基本数据类型、POJOs(普通旧Java对象)、元组(Tuples)、...

    (转)客户端访问Web Service--参数类型的序列化与反序列化(二)

    2. **自定义对象序列化**:当需要传递自定义业务对象时,博主可能会讲解如何定义数据契约(Data Contract)或者使用XML.Serialization库来标记类以便进行序列化和反序列化。 3. **数组和集合的序列化**:在处理列表...

    C#自定义可序列化的Dictionary类型

    为了解决这个问题,我们可以自定义一个可序列化的Dictionary类型,实现IXmlSerializable接口来支持XML序列化。 下面是一个自定义的可序列化的Dictionary类型的实现代码: 首先,我们需要使用XmlRoot特性来指定XML...

    Hibernate使用——自定义数据类型

    自定义数据类型可能会引入额外的序列化和反序列化开销,因此在选择自定义数据类型时,应权衡其带来的便利性和潜在的性能影响。 最后,对于工具的使用,如IDEA、Eclipse等,它们通常提供了丰富的插件支持,可以帮助...

    winform 自定义序列化源码

    1. **实现ISerializable接口**:为了自定义序列化过程,我们需要让我们的类实现ISerializable接口。这需要定义一个名为GetObjectData的方法,该方法将对象的状态写入SerializationInfo实例。 2. **构造函数**:创建...

    Qt自定义结构序列化

    在Qt框架中,序列化和反...通过以上方法,你可以有效地在Qt应用程序中对自定义结构进行序列化和反序列化,实现数据的持久化和传输。在实际开发中,根据需求调整和扩展这个机制,可以大大提升程序的灵活性和可维护性。

    spring缓存机制-自定义缓存(五, 六)

    你可以通过实现`CacheSerializer`接口来自定义序列化和反序列化逻辑,确保复杂类型的对象能正确存储和恢复。 总结来说,通过自定义缓存实现、缓存策略以及缓存注解的配置增强,我们可以极大地扩展Spring的缓存功能...

Global site tag (gtag.js) - Google Analytics