首页 文章 精选 留言 我的

精选列表

搜索[交错序列],共10005篇文章
优秀的个人博客,低调大师

hadoop中的序列化与Writable类

hadoop中自带的org.apache.hadoop.io包中有广泛的writable类可供选择,它们形成下图所示的层次结构: java基本类型的Writable封装器 Writable类对java基本类型提供封装,short和char除外,所有的封装包含get()和set()两个方法用于读取或设置封装的值 java基本类型的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类型。 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方法: 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字符 4个unicode分别占用1到4个字节,u+10400在java的unicode字符重占用两个char,前三个字符分别占用1个char. 我们通过代码来看下String和Text的不同 import java.io.*; import org.apache.hadoop.io.*; import org.apache.hadoop.util.StringUtils; import junit.framework.Assert; public class textandstring { public static void string() throws UnsupportedEncodingException { String str = "\u0041\u00DF\u6771\uD801\uDC00"; Assert.assertEquals(str.length(), 5); Assert.assertEquals(str.getBytes("UTF-8").length, 10); Assert.assertEquals(str.indexOf("\u0041"), 0); Assert.assertEquals(str.indexOf("\u00DF"), 1); Assert.assertEquals(str.indexOf("\u6771"), 2); Assert.assertEquals(str.indexOf("\uD801\uDC00"), 3); Assert.assertEquals(str.charAt(0), '\u0041'); Assert.assertEquals(str.charAt(1), '\u00DF'); Assert.assertEquals(str.charAt(2), '\u6771'); Assert.assertEquals(str.charAt(3), '\uD801'); Assert.assertEquals(str.charAt(4), '\uDC00'); Assert.assertEquals(str.codePointAt(0), 0x0041); Assert.assertEquals(str.codePointAt(1), 0x00DF); Assert.assertEquals(str.codePointAt(2), 0x6771); Assert.assertEquals(str.codePointAt(3), 0x10400); } public static void text() { Text text = new Text("\u0041\u00DF\u6771\uD801\uDC00"); Assert.assertEquals(text.getLength(), 10); Assert.assertEquals(text.find("\u0041"), 0); Assert.assertEquals(text.find("\u00DF"), 1); Assert.assertEquals(text.find("\u6771"), 3); Assert.assertEquals(text.find("\uD801\uDC00"), 6); Assert.assertEquals(text.charAt(0), 0x0041); Assert.assertEquals(text.charAt(1), 0x00DF); Assert.assertEquals(text.charAt(3), 0x6771); Assert.assertEquals(text.charAt(6), 0x10400); } public static void main(String[] args) { // TODO Auto-generated method stub text(); try { string(); } catch(UnsupportedEncodingException ex) { } } } 这样一比较就很明显了。 1.String的length()方法返回的是char的数量,Text的getLength()方法返回的是字节的数量。 2.String的indexOf()方法返回的是以char为单元的偏移量,Text的find()方法返回的是以字节为单位的偏移量。 3.String的charAt()方法不是返回的整个unicode字符,而是返回的是java中的char字符 4.String的codePointAt()和Text的charAt方法比较类似,不过要注意,前者是按char的偏移量,后者是字节的偏移量 Text的迭代 在Text中对unicode字符的迭代是相当复杂的,因为与unicode所占的字节数有关,不能简单的使用index的增长来确定。首先要把 Text对象转换为java.nio.ByteBuffer对象,然后再利用缓冲区对Text对象反复调用bytesToCodePoint方法,该方法 能获取下一代码的位置,并返回相应的int值,最后更新缓冲区中的位置。通过bytesToCodePoint()方法可以检测出字符串的末尾,并返回 -1值。看一下示例代码: import java.io.*; import java.nio.ByteBuffer; import org.apache.hadoop.io.*; import org.apache.hadoop.util.StringUtils; import junit.framework.Assert; public class textandstring { public static void main(String[] args) { // TODO Auto-generated method stub Text t = new Text("\u0041\u00DF\u6771\uD801\uDC00"); ByteBuffer buf = ByteBuffer.wrap(t.getBytes(), 0, t.getLength()); int cp; while(buf.hasRemaining() && (cp = Text.bytesToCodePoint(buf)) != -1) { System.out.println(Integer.toHexString(cp)); } } } 运行结果: 41df677110400 Text的修改 除了NullWritable是不可更改外,其他类型的Writable都是可以修改的。你可以通过Text的set方法去修改去修改重用这个实例。 public void testTextMutability() { Text text = new Text("hadoop"); text.set("pig"); Assert.assertEquals(text.getLength(), 3); Assert.assertEquals(text.getBytes().length, 3); } 注意:在某些情况下,getBytes()方法返回的字节数组可能比getLength()函数返回的长度更长: import java.io.*; import java.nio.ByteBuffer; import org.apache.hadoop.io.*; import org.apache.hadoop.util.StringUtils; import junit.framework.Assert; public class textandstring { public static void main(String[] args) { // TODO Auto-generated method stub Text t = new Text("hadoop"); t.set(new Text("pig")); Assert.assertEquals(t.getLength(), 3); Assert.assertEquals(t.getBytes().length, 6); } } Text类并不像String类那样有丰富的字符串操作API,所以多数情况下,需要将Text对象转换成String对象。这一转换过程通过调用ToString()方法来实现

优秀的个人博客,低调大师

Mahout学习之命令行创建序列文件

一:命令行转换 创建新的工作目录 mkdir lastfm mkdir ./lastfm/original export WORK_DIR=/home/thinkgamer/document/lastfm cd $WORK_DIR 自己准备一个数据集放在original文件夹下,例如将点击打开链接下边的数据保存在synthetic_control.data中进行转换,首先将其放在origiinal文件夹中 进入mahout的安装目录,前提是hadoop环境是启动的 cd /usr/local/hadoop/mahout bin/mahout seqdirectory -i $WORK_DIR/original -o $WORK_DIR/sequencesfile 然后进入$WORK_DIR目录下有一个sequencesfile文件夹 cd $WORK_DIR cd sequencesfile ls 会显示如下: part-m-00000 _SUCCESS 命令行查看part-m-00000的文件内容为: bin/mahout seqdumper -i $WORK_DIR/sequencesfile/part-m-00000 | more0 二:mapreduce转换 具体请参考mahout运行canopy程序中的程序:点击打开链接 三:命令行转换为文本文件 bin/mahout seqdumper -i $WORK_DIR/sequencesfile/part-m-00000 -o $WORK_DIR/clusteranalyzer mahout版本不同如果上边的不好使,换用下边的 bin/mahout seqdumper -s $WORK_DIR/sequencesfile/part-m-00000 -o $WORK_DIR/clusteranalyzer

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册