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比较
相关推荐
自定义数据类型必须实现WritableComparable接口,这个接口是Hadoop中用于序列化和比较数据的接口。实现了WritableComparable接口的类,不仅可以将对象写入到Hadoop的数据流中,还能在MapReduce框架中比较这些对象,...
自定义反序列化器需要遵循DebeziumDeserializationSchema接口的规范,进行必要的数据格式转换。 #### 实现步骤 1. **引入依赖项**:首先需要在项目中引入Fastjson、Debezium以及Apache Flink等核心依赖库。这些库...
- **类型转换**:定义如何将Java数据类型转换为XML数据类型,反之亦然,例如日期格式的转换。 - **命名空间处理**:如果XML文档包含命名空间,需要在映射文件中声明和处理。 - **集合和数组映射**:处理Java集合类...
总结,MapReduce提供了强大的工具来处理大规模数据,包括自定义序列化以适应各种数据类型,通过排序、分区和分组优化数据处理流程,以及使用TopN算法挖掘数据中的热点信息。理解并掌握这些基本用法对于开发高效、...
它可能是易语言中一个用于序列化自定义数据类型的工具,将复杂的数据结构转换为可存储的格式,如文本文件或二进制文件。序列化是将程序中的对象状态转换为可以存储或传输的形式的过程,反序列化则是相反的过程,将...
为了解决这个问题,我们可以自定义一个可序列化的Dictionary类型,实现IXmlSerializable接口来支持XML序列化。 下面是一个自定义的可序列化的Dictionary类型的实现代码: 首先,我们需要使用XmlRoot特性来指定XML...
在C#编程中,自定义序列化是一种将对象的状态转换为可存储或可传输的数据格式,然后能够将这些数据恢复为原始对象的过程。这在数据持久化、网络传输或者跨进程通信等场景中非常常见。本文将详细介绍两种C#中实现...
总的来说,C#中的自定义序列化通过ISerializable接口提供了对序列化过程的精细控制,允许开发者处理复杂的数据结构和特定的需求。这在处理如数据库持久化、网络传输或XML配置文件等场景时非常有用。但是,需要注意的...
本篇文章将深入探讨如何在使用Gson时进行自定义的序列化和反序列化,以及在遇到后端返回的数据类型与预期不符时的处理策略。 ### Gson自定义序列化 自定义序列化主要是为了在转换Java对象为JSON时,根据特定需求...
对于自定义数据集,我们可能需要编写代码来生成或读取数据,比如从数据库、文件或网络接口获取。`tf.data` API是TensorFlow用于构建高效数据管道的关键模块,它允许我们方便地构建复杂的数据流水线。 在强化学习中...
1. **数据类型认知**:Excel中的数据主要分为文本型和数字型。文本型数据包括姓名、地址、电话号码等,它们无法进行数学运算。数字型数据则可以进行加减乘除等运算,如销售量、价格等。 2. **单元格格式设置**: -...
在Flink中,数据类型定义了数据在系统中流动和处理的格式,而序列化则涉及到这些数据类型在传输和存储时的编码和解码机制。Flink支持多种数据类型,包括基本数据类型、POJOs(普通旧Java对象)、元组(Tuples)、...
自定义数据类型可能会引入额外的序列化和反序列化开销,因此在选择自定义数据类型时,应权衡其带来的便利性和潜在的性能影响。 最后,对于工具的使用,如IDEA、Eclipse等,它们通常提供了丰富的插件支持,可以帮助...
本文将深入探讨如何在C#中实现类的序列化,并创建自定义的文件类型来保存数据。 首先,要实现一个类的序列化,我们需要在类上添加`[Serializable]`属性,这表明该类的实例可以被序列化。例如: ```csharp ...
在Qt框架中,序列化和反...通过以上方法,你可以有效地在Qt应用程序中对自定义结构进行序列化和反序列化,实现数据的持久化和传输。在实际开发中,根据需求调整和扩展这个机制,可以大大提升程序的灵活性和可维护性。
你可以通过实现`CacheSerializer`接口来自定义序列化和反序列化逻辑,确保复杂类型的对象能正确存储和恢复。 总结来说,通过自定义缓存实现、缓存策略以及缓存注解的配置增强,我们可以极大地扩展Spring的缓存功能...
它扩展了Jackson的功能,使得`javax.money`的数据类型能够无缝地与JSON进行互操作。这个模块实现了`Module`接口,可以注册到Jackson的`ObjectMapper`中,从而使得`Money`、`MonetaryAmount`等货币相关类能够被正确地...
包含的示例代码可能涵盖了如何初始化OPC连接,如何使用OPC接口进行数据读写,如何处理报警和事件,以及如何利用自定义接口进行特定功能的操作。通过学习和理解这些示例,开发者可以快速掌握OPC编程的基本方法。 5....
对象的序列化与反序列化是计算机编程中的关键概念,特别是在数据存储、网络传输和状态持久化等场景中。这两个过程对于理解数据处理流程至关重要。 序列化是指将一个对象的状态转换为可存储或可传输的形式,通常是...
2. **实现自定义序列化**: 定义自定义类型`CustomSerializedObject`,并使用`IXmlSerializable`接口来实现自定义序列化和反序列化。这个接口有两个方法需要实现:`ReadXml` 和 `WriteXml`。 ```csharp public class...