hadoop详解(十一) 序列化与Writable实现

简介

在hadoop中,Writable的实现类是个庞大的家族,我们在这里简单的介绍一下常用来做序列化的一部分。

java原生类型

除char类型以外,所有的原生类型都有对应的Writable类,并且通过get和set方法可以他们的值。

IntWritable和LongWritable还有对应的变长VIntWritable和VLongWritable类。

固定长度还是变长的选用类似与数据库中的char或者vchar,在这里就不赘述了。

Text类型

Text类型使用变长int型存储长度,所以Text类型的最大存储为2G.

Text类型采用标准的utf-8编码,所以与其他文本工具可以非常好的交互,但要注意的是,这样的话就和java的String类型差别就很多了。

检索的不同

Text的chatAt返回的是一个整型,及utf-8编码后的数字,而不是象String那样的unicode编码的char类型。

@Test
public void testTextIndex(){
    Text text=new Text("hadoop");
    Assert.assertEquals(text.getLength(), 6);
    Assert.assertEquals(text.getBytes().length, 6);
    Assert.assertEquals(text.charAt(2),(int)'d');
    Assert.assertEquals("Out of bounds",text.charAt(100),-1);
}

Text还有个find方法,类似String里indexOf方法

@Test
public void testTextFind() {
    Text text = new Text("hadoop");
    Assert.assertEquals("find a substring",text.find("do"),2);
    Assert.assertEquals("Find first 'o'",text.find("o"),3);
    Assert.assertEquals("Find 'o' from position 4 or later",text.find("o",4),4);
    Assert.assertEquals("No match",text.find("pig"),-1);
}

Unicode的不同

当uft-8编码后的字节大于两个时,Text和String的区别就会更清晰,因为String是按照unicode的char计算,而Text是按照字节计算。

我们来看下1到4个字节的不同的unicode字符

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索string
, text
, find
, 类型
, assert
, Assert,Java
序列化详解
hadoop 序列化、hadoop 序列化机制、hadoop pcap 序列化、hadoop数据序列化、hadoop序列化框架,以便于您获取更多的相关知识。

时间: 2025-01-29 12:47:12

hadoop详解(十一) 序列化与Writable实现的相关文章

hadoop详解(十) 序列化与Writable接口

简介 序列化和反序列化就是结构化对象和字节流之间的转换,主要用在内部进程的通讯和持久化存储方 面. 通讯格式需求 hadoop在节点间的内部通讯使用的是RPC,RPC协议把消息翻译成二进制字节流发 送到远程节点,远程节点再通过反序列化把二进制流转成原始的信息.RPC的序列化需要实现以下几点: 1. 压缩,可以起到压缩的效果,占用的宽带资源要小. 2.快速,内部进程为分布式系统构建了高速链路,因 此在序列化和反序列化间必须是快速的,不能让传输速度成为瓶颈. 3.可扩展的,新的服务端为新的客户 端增

hadoop详解(十三) 序列化框架

框架简介 MapReduce仅仅可以支持Writable做key,value吗?答案是否定的.事实上,一切类型都是支 持的,只需满足一个小小的条件:每个类型是以二进制流的形式传输.为此Hadoop提供了一个序列化框架来支 持,他们在org.apache.hadoop.io.serializer包中,Writable可以作为MapReduce支持的类型也是因为实现了 这个框架,类不多,我们从几个接口说起. Serializer 定义了一组接口,打开流,序列化,关闭流 public interfac

hadoop详解(十二) 自定义Writable

自定义Writable hadoop虽然已经实现了一些非常有用的Writable,而且你可以使用他们的组合做很 多事情,但是如果你想构造一些更加复杂的结果,你可以自定义Writable来达到你的目的,我们以注释的方式 对自定义Writable进行讲解(不许说我只帖代码占篇幅哦,姿势写在注释里了): package com.sweetop.styhadoop; import org.apache.hadoop.io.Text; import org.apache.hadoop.io.Writabl

hadoop详解(九) mapreduce中的压缩

作为输入 当压缩文件做为mapreduce的输入时,mapreduce将自动通过扩展名找到相应的codec对其解压 . 作为输出 当mapreduce的输出文件需要压缩时,可以更改mapred.output.compress为true, mapped.output.compression.codec为想要使用的codec的类名就 可以了,当然你可以在代码中指定,通过 调用FileOutputFormat的静态方法去设置这两个属性,我们来看代码: package com.sweetop.styha

hadoop详解(八) codec

简介 codec其实就是coder和decoder两个单词的词头组成的缩略词.CompressionCodec定义了压缩 和解压接口,我们这里讲的codec就是实现了CompressionCodec接口的一些压缩格式的类,下面是这些类的列 表: 使用CompressionCodes解压缩 CompressionCodec有两个方法可以方便的压缩和解压. 压缩 :通过createOutputStream(OutputStream out)方法获得CompressionOutputStream对象

hadoop详解(五) Archives

简介 我们在hadoop深入研究:(一)--hdfs介绍里已讲过,hdfs并不擅长存储小文件,因为每个文件最 少一个block,每个block的元数据都会在namenode节点占用内存,如果存在这样大量的小文件,它们会吃掉 namenode节点的大量内存. hadoop Archives可以有效的处理以上问题,他可以把多个文件归档成为一个文 件,归档成一个文件后还可以透明的访问每一个文件,并且可以做为mapreduce任务的输入. 用法 hadoop Archives可以使用archive工具创

hadoop详解(二) java访问hdfs

所有源码在github上,https://github.com/lastsweetop/styhadoop 读数据使用hadoop url读取 比较简单的读取hdfs数据的方法就是通过java.net.URL打开一个流,不过在这之前先要预先调用它的 setURLStreamHandlerFactory方法设置为FsUrlStreamHandlerFactory(由此工厂取解析hdfs协议),这个方 法只能调用一次,所以要写在静态块中.然后调用IOUtils类的copyBytes将hdfs数据流拷

详解PHP序列化反序列化的方法_php技巧

经常看到一些配置文件里面存放的是一些类似带有格式的变量名称和值,其实就是一个序列化的过程,在需要用到这些数据库的时候会进行一个反序列化过程,就是将这个字符串再还原成他原来的数据结构.下面说说php 如何进行数据的序列化和反序列化的. php 将数据序列化和反序列化其实就用到两个函数,serialize 和unserialize.serialize 将数组格式化成有序的字符串unserialize 将数组还原成数组例如: $user=array('Moe','Larry','Curly'); $u

hadoop详解(七) 压缩

文件压缩主要有两个好处,一是减少了存储文件所占空间,另一个就是为数据传输提速.在hadoop大数据 的背景下,这两点尤为重要,那么我现在就先来了解下hadoop中的文件压缩. hadoop里支持很多种压 缩格式,我们看一个表格: DEFLATE是同时使用了LZ77算法与哈夫曼编码(Huffman Coding)的一个无损数据压缩算法,源代码可 以在zlib库中找到.gzip是以DEFLATE算法为基础扩展出来的一种算法. 所有的压缩算法都是空间和时 间的转换,更快压缩时间还是更小的压缩比,可以通