读取SequenceFile中自定义Writable类型值

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

 1 package matrix;
 2 import org.apache.hadoop.io.*;
 3 public class DoubleArrayWritable extends ArrayWritable {
 4       public DoubleArrayWritable(){
 5           super(DoubleWritable.class);
 6       }
 7       public  double[] convert2double(DoubleWritable[] w){
 8           double[] value=new double[w.length];
 9           for (int i = 0; i < value.length; i++) {
10               value[i]=Double.valueOf(w[i].get());
11           }
12           return value;
13       }
14
15
16     }
17
18    

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

 1 package convert;
 2
 3 /**
 4  * Created with IntelliJ IDEA.
 5  * User: hadoop
 6  * Date: 16-1-19
 7  * Time: 下午3:09
 8  * To change this template use File | Settings | File Templates.
 9  */
10 import java.io.IOException;
11 import java.net.URI;
12
13 import org.apache.hadoop.conf.Configuration;
14 import org.apache.hadoop.fs.FileSystem;
15 import org.apache.hadoop.fs.Path;
16 import org.apache.hadoop.io.DoubleWritable;
17 import org.apache.hadoop.io.IOUtils;
18 import org.apache.hadoop.io.IntWritable;
19 import org.apache.hadoop.io.LongWritable;
20 import org.apache.hadoop.io.SequenceFile;
21 import org.apache.hadoop.io.Text;
22 import org.apache.commons.io.FileUtils;
23 import org.apache.commons.io.LineIterator;
24
25
26
27 //import Jama.Matrix.*;
28 //import  java.io.IOException;
29 import java.io.File;
30
31 //import javax.sound.midi.SysexMessage;
32 public class SequenceFileWriteDemo {
33     public static void main(String[] args) throws IOException {
34         String uri ="/home/hadoop/srcData/bDoubleArraySeq";
35         Configuration conf = new Configuration();
36         FileSystem fs = FileSystem.get(URI.create(uri), conf);
37         Path path = new Path(uri);
38         IntWritable key = new IntWritable();
39         DoubleArrayWritable value = new DoubleArrayWritable();
40         SequenceFile.Writer writer = null;
41         try {
42             writer = SequenceFile.createWriter(fs, conf, path, key.getClass(),
43                     value.getClass());
44
45
46             final LineIterator it2 = FileUtils.lineIterator(new File("/home/hadoop/srcData/transB.txt"), "UTF-8");
47             try {
48                 int i=0;
49                 String[] strings;
50                 DoubleWritable[] ArrayDoubleWritables;
51                 while (it2.hasNext()) {
52                     ++i;
53                     final String line = it2.nextLine();
54                     key.set(i);
55                     strings=line.split("\t");
56                     ArrayDoubleWritables=new DoubleWritable[strings.length];
57                     for (int j = 0; j < ArrayDoubleWritables.length; j++) {
58                         ArrayDoubleWritables[j] =new DoubleWritable(Double.valueOf(strings[j]));
59
60                     }
61
62                     value.set(ArrayDoubleWritables);
63                     writer.append(key,value);
64                     //System.out.println("ffd");
65
66                 }
67             } finally {
68                 it2.close();
69             }
70
71         }finally {
72             IOUtils.closeStream(writer);
73         }
74         System.out.println("ok");
75
76     }
77
78 }

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;

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

参考:

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/

				
时间: 2024-10-06 12:55:32

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

hadoop中典型Writable类详解

本文地址:http://www.cnblogs.com/archimedes/p/hadoop-writable.html,转载请注明源地址. Hadoop将很多Writable类归入org.apache.hadoop.io包中,在这些类中,比较重要的有Java基本类.Text.Writable集合.ObjectWritable等,重点介绍Java基本类和ObjectWritable的实现. 1. Java基本类型的Writable封装 目前Java基本类型对应的Writable封装如下表所示.

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

MapTask类 在MapTask类中找到run函数 if(useNewApi){       runNewMapper(job, splitMetaInfo, umbilical, reporter);     } 再找到runNewMapper @SuppressWarnings("unchecked")   private<INKEY,INVALUE,OUTKEY,OUTVALUE>   void runNewMapper(final JobConf job,    

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

Job类  /**    * Define the comparator that controls which keys are grouped together    * for a single call to    * {@link Reducer#reduce(Object, Iterable,    *                       org.apache.hadoop.mapreduce.Reducer.Context)}    * @param cls the raw

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

今天在使用Nlog的时候,发现了一个之前没注意的问题. 以前,我的app配置文件都是这么写的,当然配置比较多的时候会改用xml. 如果<appSettings>节点中的内容很多的话,我自己有时候都分不清哪个是做什么的,可能朋友们会说,你加个注释不就行了.但是可不可以把一些相同的配置放在一起呢,就像上面的nlog一样.先试着改造下配置文件 1 <configSections> 2 <section name="mySection" type="Co

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

MRJobConfig public static fina COMBINE_CLASS_ATTR 属性COMBINE_CLASS_ATTR = "mapreduce.job.combine.class" ————子接口(F4) JobContent 方法getCombinerClass ————子实现类 JobContextImpl 实现getCombinerClass方法: public Class<? extends Reducer<?,?,?,?>> g

c#(winform)中自定义ListItem类方便ComboBox添加Item项

1.定义ListItem类 public class ListItem { private string _key = string.Empty; private string _value = string.Empty; public ListItem(string pKey, string pValue) { _key = pKey; _value = pValue; } public override string ToString() { return this._value; } pu

【MVC】中自定义扩展类实现客户端验证

照图片一步一步做,你就会成功的~ 哈哈 注意细节哦~

Hadoop中Writable类之四

1.定制Writable类型 Hadoop中有一套Writable实现,例如:IntWritable.Text等,但是,有时候可能并不能满足自己的需求,这个时候,就需要自己定制Writable类型. 定制分以下几步: 需要实现WritableComparable接口,因为Writable常常作为健值对出现,而在MapReduce中,中间有个排序很重要,因此,Hadoop中就让Writable实现了WritableComparable 需要实现WritableComparable的write().

Hadoop中Writable类

1.Writable简单介绍 在前面的博客中,经常出现IntWritable,ByteWritable.....光从字面上,就可以看出,给人的感觉是基本数据类型 和 序列化!在Hadoop中自带的org.apache.hadoop.io包中有广泛的Writable类可供选择.它们的层次结构如下图所示: Writable类对Java基本类型提供封装,short 和 char除外(可以存储在IntWritable中).所有的封装包包含get()  和 set() 方法用于读取或者设置封装的值.如下表