Hadoop周边环境:Hadoop2.4

定义中的Hadoop的Writable时间,有时你需要使用数组,而不是简单的单一值或串。例如,下面的代码:

package test;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException; import org.apache.hadoop.io.WritableComparable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class MyData implements WritableComparable<MyData>,Cloneable {
private Logger log = LoggerFactory.getLogger(MyData.class); private float[] distance; public MyData(){// 空指针异常
set(new float[6]); // 凝视掉此行代码,在readFields会有空指针异常
} public MyData(float[] distance) {
set(distance);
}
public void set(float[] distance) {
this.distance=distance;
} @Override
public void readFields(DataInput arg0) throws IOException {
for(int i=0;i<distance.length;i++){
distance[i]=arg0.readFloat();
}
}
@Override
public void write(DataOutput arg0) throws IOException { for(int i=0;i<distance.length;i++){ arg0.writeFloat(distance[i]);
}
}
@Override
public int compareTo(MyData o) {// 当前值小于o则返回负数 float[] oDistance =o.distance;
int cmp=0;
for(int i=0;i<oDistance.length;i++){ if(Math.abs(this.distance[i]-oDistance[i])<0.0000000001){
continue; // 比較下一个
}
if(this.distance[i]<oDistance[i]){
return -1;
}else{
return 1;
}
} return cmp;
} @Override
public int hashCode(){
int hashCode =0;
for(int i=0;i<distance.length;i++){ hashCode=+Float.floatToIntBits(distance[i]);
}
return hashCode;
} public float[] getDistance() {
return distance;
} public void setDistance(float[] distance) {
this.distance = distance;
} }

能够看到其无參构造函数里面含有一个初始化的操作。这个初始化的操作限定了其矩阵distance的维度(代码中设置为6),可是一般这个值由外部设置才比較合适,可是在读取的时候,也就是readFields的时候是从这个无參构造函数进入的,这里没有办法设置參数,没有办法在外面初始化这个矩阵的大小,可是不设置又不行。有没有什么办法呢?在Mahout的一些代码中能够看到相似的代码。比方VectorWritable,从VectorWritable能够找到解决问题的答案。

先看看vectorWritable的一段代码:

 @Override
public void readFields(DataInput in) throws IOException {
int flags = in.readByte();
int size = Varint.readUnsignedVarInt(in);
readFields(in, (byte) flags, size);
}

通过这段代码能够知道。不一定要通过外部传入。事实上能够从in中读取就可以。详细怎样做呢?定义一个数组distance的大小变量,比方为num。然后把num在write中写入,然后在readFields中先读出,然后再初始化数组distance,这样就不会有刚才的问题了。详细代码例如以下:

package test;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException; import org.apache.hadoop.io.WritableComparable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class MyData implements WritableComparable<MyData>,Cloneable {
private Logger log = LoggerFactory.getLogger(MyData.class); private float[] distance;
private int num;
public MyData(){// 此处不再有空指针异常
// set(new float[6]); // 凝视掉此行代码,在readFields不会有空指针异常
} public MyData(float[] distance) {
this.num=distance.length;
set(distance);
}
public void set(float[] distance) {
this.distance=distance;
} @Override
public void readFields(DataInput arg0) throws IOException {
num = arg0.readInt();
distance = new float[num];
for(int i=0;i<distance.length;i++){
distance[i]=arg0.readFloat();
}
}
@Override
public void write(DataOutput arg0) throws IOException {
arg0.writeInt(num);
for(int i=0;i<distance.length;i++){ arg0.writeFloat(distance[i]);
}
}
@Override
public int compareTo(MyData o) {// 当前值小于o则返回负数 float[] oDistance =o.distance;
int cmp=0;
for(int i=0;i<oDistance.length;i++){ if(Math.abs(this.distance[i]-oDistance[i])<0.0000000001){
continue; // 比較下一个
}
if(this.distance[i]<oDistance[i]){
return -1;
}else{
return 1;
}
} return cmp;
} @Override
public int hashCode(){
int hashCode =0;
for(int i=0;i<distance.length;i++){ hashCode=+Float.floatToIntBits(distance[i]);
}
return hashCode;
} public float[] getDistance() {
return distance;
} public void setDistance(float[] distance) {
this.distance = distance;
} }

通过上面的改进,就不用操心 空指针的问题了。

分享。成长,快乐

转载请注明blog地址:http://blog.csdn.net/fansy1990

版权声明:本文博客原创文章,博客,未经同意,不得转载。

Hadoop 它们的定义Writable NullpointerException的更多相关文章

  1. Hadoop Serialization hadoop序列化详解(最新版) (1)【java和hadoop序列化比较和writable接口】

    初学java的人肯定对java序列化记忆犹新.最开始很多人并不会一下子理解序列化的意义所在.这样子是因为很多人还是对java最底层的特性不是特别理解,当你经验丰富,对java理解更加深刻之后,你就会发 ...

  2. hadoop自带的writable类型

    Hadoop 中,并没有使用Java自带的基本类型类(Integer.Float等),而是使用自己开发的类.Hadoop 自带有很多序列化类型,大致分为以下两种: 实现了WritableCompara ...

  3. 使用hadoop命令rcc生成Record 一个简单的方法来实现自己的定义writable对象

    hadoop 的bin文件夹以下一个rcc命令,网上介绍非常少.看了一下源代码.发现能够用来生成 java和c++的hadoop Record 类代码,比起自己直接实现writable 接口.简单非常 ...

  4. Hadoop中序列化与Writable接口

    学习笔记,整理自<Hadoop权威指南 第3版> 一.序列化 序列化:序列化是将 内存 中的结构化数据 转化为 能在网络上传输 或 磁盘中进行永久保存的二进制流的过程:反序列化:序列化的逆 ...

  5. hadoop中实现定制Writable类

    Hadoop中有一套Writable实现可以满足大部分需求,但是在有些情况下,我们需要根据自己的需要构造一个新的实现,有了定制的Writable,我们就可以完全控制二进制表示和排序顺序. 为了演示如何 ...

  6. hbase报错org.apache.hadoop.ipc.RemoteException(java.lang.NullPointerException): java.lang.NullPointerException

    这个错误找了好长时间,日志看半天,找度娘没什么用,再看stackoverflow,上面有几篇相关的帖子,但是没人回答. 看半天,没有cause,只好到idea中去看sortLocalSorts源码,结 ...

  7. Hadoop基础-序列化与反序列化(实现Writable接口)

    Hadoop基础-序列化与反序列化(实现Writable接口) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.序列化简介 1>.什么是序列化 序列化也称串行化,是将结构化 ...

  8. Hadoop Serialization -- hadoop序列化详解 (3)【ObjectWritable,集合Writable以及自定义的Writable】

    前瞻:本文介绍ObjectWritable,集合Writable以及自定义的Writable TextPair 回顾: 前面了解到hadoop本身支持java的基本类型的序列化,并且提供相应的包装实现 ...

  9. Hadoop中Writable类之四

    1.定制Writable类型 Hadoop中有一套Writable实现,例如:IntWritable.Text等,但是,有时候可能并不能满足自己的需求,这个时候,就需要自己定制Writable类型. ...

随机推荐

  1. 训练赛 Grouping(强连通分量缩点 + DAG求最长路)

    http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=158#problem/F 大致题意:给出n个人和m种关系(ti,si),表示ti ...

  2. ZOJ 2110 Tempter of the Bone(条件迷宫DFS,HDU1010)

    题意  一仅仅狗要逃离迷宫  能够往上下左右4个方向走  每走一步耗时1s  每一个格子仅仅能走一次且迷宫的门仅仅在t时刻打开一次  问狗是否有可能逃离这个迷宫 直接DFS  直道找到满足条件的路径 ...

  3. HBaseConvetorUtil 实体转换工具

    HBaseConvetorUtil 实体转换工具类 public class HBaseConvetorUtil {        /**    * @Title: convetor    * @De ...

  4. Blink: Chromium的新渲染引擎

    编自http://www.chromium.org/blink 关于blink Google Chrome/Chromium 从创始至今一直使用 WebKit(WebCore) 作为 HTML/CSS ...

  5. 再说JNDI

    说到JNDI,即熟悉又陌生,熟悉在常常使用,如EJB3.0中的@EJB注入,底层实现即是JNDI的方式:喜闻乐见的: Context ctx=new InitialContext(); Object ...

  6. Oracle 11g client安装和配置。

    数据库和client在不同的机器. 安装前的准备.在安装过程中Oracle数据库server导航到下面的文件夹. 将listener.ora和tnsnames.ora中的host中的localhost ...

  7. ADO.NET连接方式

    使用Command.DataReader和DataSet两种方法实现数据绑定 方法1:使用Command和DataReader SqlConnection con = new SqlConnectio ...

  8. 安卓反汇编工具arm-eabi-objdump

    安卓反汇编工具 在Arm平台系统自带的反编译工具在android/prebuild/linux-/toolchail/arm-abil-/bin目录下的arm_eabi-objdump进行反汇编 ar ...

  9. android学习经常使用的数据文件夹

    android工程实践 1.仿360一键清理实现(一) "一键清理"是一个桌面图标,点击图标后,显示一个视图.进行清理动画.之后显示清理了几个进程,释放了多少M内存.点击" ...

  10. filestream.read(buffer,offset,count)的正确解释

    filestream.read(buffer,offset,count) offset是buffer的偏移量 所以,filestream.read(buffer,1,count)会报下面的错 Syst ...