Hadoop 它们的定义Writable NullpointerException
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的更多相关文章
- Hadoop Serialization hadoop序列化详解(最新版) (1)【java和hadoop序列化比较和writable接口】
初学java的人肯定对java序列化记忆犹新.最开始很多人并不会一下子理解序列化的意义所在.这样子是因为很多人还是对java最底层的特性不是特别理解,当你经验丰富,对java理解更加深刻之后,你就会发 ...
- hadoop自带的writable类型
Hadoop 中,并没有使用Java自带的基本类型类(Integer.Float等),而是使用自己开发的类.Hadoop 自带有很多序列化类型,大致分为以下两种: 实现了WritableCompara ...
- 使用hadoop命令rcc生成Record 一个简单的方法来实现自己的定义writable对象
hadoop 的bin文件夹以下一个rcc命令,网上介绍非常少.看了一下源代码.发现能够用来生成 java和c++的hadoop Record 类代码,比起自己直接实现writable 接口.简单非常 ...
- Hadoop中序列化与Writable接口
学习笔记,整理自<Hadoop权威指南 第3版> 一.序列化 序列化:序列化是将 内存 中的结构化数据 转化为 能在网络上传输 或 磁盘中进行永久保存的二进制流的过程:反序列化:序列化的逆 ...
- hadoop中实现定制Writable类
Hadoop中有一套Writable实现可以满足大部分需求,但是在有些情况下,我们需要根据自己的需要构造一个新的实现,有了定制的Writable,我们就可以完全控制二进制表示和排序顺序. 为了演示如何 ...
- hbase报错org.apache.hadoop.ipc.RemoteException(java.lang.NullPointerException): java.lang.NullPointerException
这个错误找了好长时间,日志看半天,找度娘没什么用,再看stackoverflow,上面有几篇相关的帖子,但是没人回答. 看半天,没有cause,只好到idea中去看sortLocalSorts源码,结 ...
- Hadoop基础-序列化与反序列化(实现Writable接口)
Hadoop基础-序列化与反序列化(实现Writable接口) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.序列化简介 1>.什么是序列化 序列化也称串行化,是将结构化 ...
- Hadoop Serialization -- hadoop序列化详解 (3)【ObjectWritable,集合Writable以及自定义的Writable】
前瞻:本文介绍ObjectWritable,集合Writable以及自定义的Writable TextPair 回顾: 前面了解到hadoop本身支持java的基本类型的序列化,并且提供相应的包装实现 ...
- Hadoop中Writable类之四
1.定制Writable类型 Hadoop中有一套Writable实现,例如:IntWritable.Text等,但是,有时候可能并不能满足自己的需求,这个时候,就需要自己定制Writable类型. ...
随机推荐
- Html5 Device API详解
三.四月曾学习过html5相关知识,并就html5 device api做过一次讲解 课程时长一个小时,预期达到level 200目标,即知道html5 device api是什么,且知道怎么实现 面 ...
- SQL Server :理解BCM页
原文:SQL Server :理解BCM页 今天我们来讨论下批量更改映射(Bulk Changed Map:BCM)页,还有大容量日志恢复模式( bulk logged recovery model ...
- Windows Phone开发(9):关于页面状态
原文:Windows Phone开发(9):关于页面状态 按照一般做法,刚学会如何导航,还是不够的,因为要知道,手机里面的每个页面,就如同Web页面一样,是无状态的. 啥是无状态?如果我们玩过Web开 ...
- Storm On YARN带来的好处
1)弹性计算资源 将storm执行在yarn上后.Storm能够与其它计算框架(如mapreduce)共享整个集群的资源.这样当Storm负载骤增时,可动态为它添加计算资源. 负载减小时,能够 ...
- Linux 下 Error: Could not find or load main class Hello
在linux下写了一个很easy的Hello world程序,编译执行居然报错:Error: Could not find or load main class Hello 最后发现是CLASSPAT ...
- easyui DateTimeBox OK
一.datetimebox ok按钮没有点击事件,但是可以通过onSelect事件模拟出“点击了ok按钮一样的效果”,我的代码: 关键: 0,理解DateTimeBox控件,这个控件是由DateB ...
- Dom4j分解xml
package cn.com.guju.util; import java.io.ByteArrayInputStream; import java.io.UnsupportedEncodingExc ...
- 检验身份证的正确性(Golang版本)
// CheckID_card project main.go package main /* * ai -> a1 , a2, a3, a4, a5, a6... a17 (a18 是校验码) ...
- C++笔试面试总结
手游广州某公司书面今天接受采访时.刚进去中午1中场休息.他们公司谁刚刚醒来,一个冷漠打牌,然后去上班.瞬间,这些公司有没有什么好印象,压抑. 接着快2点的时候.发了一份笔试题.大部分题目均在网上的&l ...
- ZOJ 3734 LIKE vs CANDLE
题目意思:(13年长沙站的一道水DP,本人也去了,当时太水笔) 说俩个人竞争选票,每个人可以随机选择支持谁.每个人带有权重不同. 现在已经结束了投票阶段,你一个骇客 支持LIKE 你写了一个软件可以 ...