记一次深刻的教训-----将mat数据转化为SequenceFile( 二 )



记一次深刻的教训-----将mat数据转化为SequenceFile

文章插图
至此,终于找到了原因,就是代码有问题 。数组是用来存储矩阵的一列,数组长度矩阵的行数,但是原先的代码里却将数组长度定义为矩阵的列数 。
DoubleWritable[] columnVector=new DoubleWritable[matrix[0].length];for (int i=0;i }
这就解释了,为什么1k*1100的矩阵转化时会提示空指针异常,按照上述对的定义,这个列向量数组的长度是1100,但是在接下来给这个向量赋值时,是由矩阵的行数来控制,也就是说在赋值时只是对复制到第1000个元素,剩下的100个元素是空(如果是系统的基本类型,如int ,编译器会将其置为0,不过不是基本类型),也就是“null”,所以在接下来使用.(key,vlaue)调用输出流写出的时候,自然会抛出“java.lang.”异常 。经过修改的代码如下:
1 /** 2* Created with IntelliJ IDEA. 3* User: hadoop 4* Date: 16-3-6 5* Time: 上午10:56 6* To change this template use File | Settings | File Templates. 7*/ 8 //package java.io; 9 import com.jmatio.io.MatFileReader;10 import com.jmatio.types.*;11 import java.io.IOException;12 import org.apache.hadoop.conf.Configuration;13 import org.apache.hadoop.fs.FileSystem;14 import org.apache.hadoop.fs.Path;15 import org.apache.hadoop.io.*;16 public class mat2Seq {17public static void main(String[] args) throws IOException {18writeMat2Seq("data/1k_1k/F1k1k.mat","SeqOutput/F1k1k");19writeMat2Seq("data/100_100/b100.mat","SeqOutput/b100");20writeMat2Seq("data/1k1100/mat1k1100.mat","SeqOutput/test1k1100");21writeMat2Seq("data/B1k2w.mat","SeqOutput/1k2w");22 23//writeMat2Seq("data/1k_2w/B1k2w.mat","SeqOutput5/B1k2w");24}25 26public static void writeMat2Seq(String matPath,String SeqOutput) throws IOException {27MatFileReader reader=new MatFileReader(matPath);28MLArray mlArray=reader.getMLArray("a");29MLDouble doubleValue=http://www.kingceram.com/post/(MLDouble)mlArray;30double[][] matrix=doubleValue.getArray();31Configuration conf =new Configuration();32//FileSystem fs=FileSystem.get(URI.create(SeqOutput),conf);33FileSystem fs=FileSystem.get(conf);34Path path=new Path(SeqOutput);35//FSDataOutputStream outputStream=fs.create(path);36IntWritable key=new IntWritable();37DoubleArrayWritable value=new DoubleArrayWritable();38SequenceFile.Writer writer=null;39try {40writer=SequenceFile.createWriter(fs,conf,path,key.getClass(),value.getClass());41 42// SequenceFile.Writer.Option43if (matPath.endsWith("F1k.mat")){//左矩阵F依次将行存储到Seq44DoubleWritable[] rowVector=new DoubleWritable[matrix[0].length];45for (int i=0;i