1)hadoop允许程序员创建自定义的数据类型,如果是key则必须要继承WritableComparable,因为key要参与排序,而value只需要继承Writable就可以了。以下定义一个DoubleArrayWritable,继承自ArrayWritable。代码如下:

 package matrix;
import org.apache.hadoop.io.*;
public class DoubleArrayWritable extends ArrayWritable {
public DoubleArrayWritable(){
super(DoubleWritable.class);
}
public double[] convert2double(DoubleWritable[] w){
double[] value=new double[w.length];
for (int i = 0; i < value.length; i++) {
value[i]=Double.valueOf(w[i].get());
}
return value;
} }

2)以下就是读取tansB.txt文件,将其值转化为DoubleArrayWritable存储到SequenceFile中。

 package convert;

 /**
* Created with IntelliJ IDEA.
* User: hadoop
* Date: 16-1-19
* Time: 下午3:09
* To change this template use File | Settings | File Templates.
*/
import java.io.IOException;
import java.net.URI; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.SequenceFile;
import org.apache.hadoop.io.Text;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.LineIterator; //import Jama.Matrix.*;
//import java.io.IOException;
import java.io.File; //import javax.sound.midi.SysexMessage;
public class SequenceFileWriteDemo {
public static void main(String[] args) throws IOException {
String uri ="/home/hadoop/srcData/bDoubleArraySeq";
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(URI.create(uri), conf);
Path path = new Path(uri);
IntWritable key = new IntWritable();
DoubleArrayWritable value = new DoubleArrayWritable();
SequenceFile.Writer writer = null;
try {
writer = SequenceFile.createWriter(fs, conf, path, key.getClass(),
value.getClass()); final LineIterator it2 = FileUtils.lineIterator(new File("/home/hadoop/srcData/transB.txt"), "UTF-8");
try {
int i=0;
String[] strings;
DoubleWritable[] ArrayDoubleWritables;
while (it2.hasNext()) {
++i;
final String line = it2.nextLine();
key.set(i);
strings=line.split("\t");
ArrayDoubleWritables=new DoubleWritable[strings.length];
for (int j = 0; j < ArrayDoubleWritables.length; j++) {
ArrayDoubleWritables[j] =new DoubleWritable(Double.valueOf(strings[j])); } value.set(ArrayDoubleWritables);
writer.append(key,value);
//System.out.println("ffd"); }
} finally {
it2.close();
} }finally {
IOUtils.closeStream(writer);
}
System.out.println("ok"); } }

3)将Seq文件上传,然后使用命令查看此Seq文件中的内容:

hadoop fs -text /lz/data/transBSeq

结果提示:

java.lang.RuntimeException: java.io.IOException: WritableName can't load class:matrix.DoubleArrayWritable

4)原因是新定义的Double数组属于第三方包,hadoop不能直接识别,需要将其以上DoubleArrayWritable的源码打成jar包,然后将此jar包的路径在Master端的hadoop-env.sh文件中配置,在其中加入第三方类的位置信息,多个jar包用逗号(,)分割:

export HADOOP_CLASSPATH=/home/hadoop/DoubleArrayWritable.jar;

如下所示,将自定义的DoubleArrayWritable和IntArrayWritable加入到Hadoop_classpath路径中,设置hadoop的环境参数值时可以不加双引号“”,多个jar包以逗号分割,如下所示:

5)然后,使用hadoop fs -text /lz/data/transBSeq就可以看到文件的内容了。如下所示:

可以看到,就是把内存中的对象,持久化存储到了文件中(序列化就是实现内存中”活对象“的持久化存储),为什么看不到具体的内容呢(我明明存储的是一个double数组呀)?我们看到的这个convert.DoubleArrayWritable@264b62a2就是内存中对象的序列化之后的结果,再将这个反序列化之后就可以看到你的double数组了。

参考:

http://www.eveningdrum.com/2014/05/04/hadoop%E4%BD%BF%E7%94%A8%E7%AC%AC%E4%B8%89%E6%96%B9%E4%BE%9D%E8%B5%96jar%E5%8C%85/

6)SequenceFile被称为小文件的容器,主要是用来处理小文件的问题,一般小文件远远小于hadoop物理块的大小,那么分片的时候就会将一个小文件切分为一个单独的分片,而一个分片对应一个mapper,如果有大量的小文件,那么运行mapreduce作业的时候就会启动大量的mapper,增加调度开销,而一个mapper运行时间又很小,因此为了优化小文件的问题,提出了SequenceFile文件格式,这种文件由二进制形式的key-value组成,如果将key设计为文件名称,value为文件内容的话,就将大批小文件合并为一个大文件,SequenceFile也就成了名副其实的小文件容器。(http://www.aliog.com/19501.htmlhttp://dongxicheng.org/mapreduce/hdfs-small-files-solution/

												

读取SequenceFile中自定义Writable类型值的更多相关文章

  1. problem: vue之数组元素中的数组类型值数据改变却无法在子组件视图更新问题

    问题:给父组件上的一个数组中的某个元素中的数组类型值,添加值后,数据没有在子组件上更新. 对元素添加值之后,vue的数据其实已经更新了并传给了子组件,子组件中没有立即更新. 那么这里有个问题,在子组件 ...

  2. hadoop中典型Writable类详解

    本文地址:http://www.cnblogs.com/archimedes/p/hadoop-writable.html,转载请注明源地址. Hadoop将很多Writable类归入org.apac ...

  3. flask中自定义日志类

    一:项目架构 二:自定义日志类 1. 建立log.conf的配置文件 log.conf [log] LOG_PATH = /log/ LOG_NAME = info.log 2. 定义日志类 LogC ...

  4. 关于MapReduce中自定义分区类(四)

    MapTask类 在MapTask类中找到run函数 if(useNewApi){       runNewMapper(job, splitMetaInfo, umbilical, reporter ...

  5. 关于MapReduce中自定义分组类(三)

    Job类  /**    * Define the comparator that controls which keys are grouped together    * for a single ...

  6. python3.4中自定义数组类(即重写数组类)

    '''自定义数组类,实现数组中数字之间的四则运算,内积运算,大小比较,数组元素访问修改及成员测试等功能''' class MyArray: '''保证输入值为数字元素(整型,浮点型,复数)''' de ...

  7. 关于MapReduce中自定义Combine类(一)

    MRJobConfig      public static fina COMBINE_CLASS_ATTR      属性COMBINE_CLASS_ATTR = "mapreduce.j ...

  8. C#读取Appconfig中自定义的节点

    今天在使用Nlog的时候,发现了一个之前没注意的问题. 以前,我的app配置文件都是这么写的,当然配置比较多的时候会改用xml. 如果<appSettings>节点中的内容很多的话,我自己 ...

  9. Java中自定义注解类,并加以运用

    在Java框架中,经常会使用注解,而且还可以省很多事,来了解下自定义注解. 注解是一种能被添加到java代码中的元数据,类.方法.变量.参数和包都可以用注解来修饰.注解对于它所修饰的代码并没有直接的影 ...

随机推荐

  1. Spring MVC框架下 从后台读取数据库并显示在前台页面【笔记自用 不推荐作为参考】

    1.书写jsp页面  people.jsp 1.设计显示格式以及内容显示 2.设计显示内容的范围 2.书写entity实体类 PeopleFormMap.java 书写传入的参数主要包括 要引用的数据 ...

  2. OpenStack搭建glance

    1.创建数据库 mysql -uroot -p create database glance; grant all privileges on glance.* to glance@'localhos ...

  3. JAVA中List<Long> 转long[]的方法

    之前每次都是通过循环去写,感觉代码不够优雅,百度了一下,查到如下的写法,先记下来: List<Long> list = new ArrayList<Long>(); list. ...

  4. 【poj3420】递推式转矩阵乘法

    历史性的时刻!!! 推了一晚上!和hyc一起萌萌哒地推出来了!! 被摧残蹂躏的智商啊!!! 然而炒鸡高兴!! (请不要介意蒟蒻的内心独白..) 设a[i]为扫到第i行时的方案数. 易知,对于一行1*4 ...

  5. codechef T1 What's int the name

    NITIKA: 姓名本无意题目描述 Nitika 读了一本历史书,想要理清其中的人物关系.因此她要她的哥哥把书中出现的历史人 物全部列出来.哥哥把列好的人名给了 Nitika,但 Nitika 非常不 ...

  6. [BZOJ1004] [HNOI2008]Cards解题报告(Burnside引理)

    Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张红 ...

  7. [POJ2135]最小费用最大流

    一直由于某些原因耽搁着...最小费用最大流没有搞会. 今天趁着个人状态正佳,赶紧去看看,果然30min不到看会了算法+模板并且A掉了一道题. 感觉最小费用最大流在学过了最大流之后还是挺好理解的.找到从 ...

  8. 【AtCoder】ARC082 F - Sandglass

    [链接]F - Sandglass [题意]给定沙漏A和B,分别装着a和X-a的沙子,开始时A在上B在下,每秒漏1,漏完不再漏.给定n,有n个时刻ai沙漏倒转.给定m个询问,每次询问给定初值a和时刻t ...

  9. php session 阻塞 过期不自动清除session文件

     php默认session session_start后,php就会打开session文件,然后同一时间用户再用那个session_id访问,就会被前面那个请求阻塞直到前面一个访问结束才会释放文件在使 ...

  10. ILSPY反编译工具下载代替收费的Reflector工具

    原文发布时间为:2011-10-10 -- 来源于本人的百度文章 [由搬家工具导入] ILSPY反编译工具下载 http://build.sharpdevelop.net/BuildArtefacts ...