虽然ArrayWritable不是接口,但貌似必须要子类去extends ArrayWritable,不能直接用ArrayWriable

否则会报下面的错误?(不是很确定)

java.lang.Exception: java.lang.RuntimeException: java.lang.NoSuchMethodException: org.apache.hadoop.io.ArrayWritable.<init>()

下面是我自己实现的ArrayWritable,完全是自己摸索的网上看到的几篇感觉都不是很靠谱

这个是为了Reduce输出结果中包含一个list,我研究一个晚上的时间,才把它弄好,结果后来发现标准答案,是用StringBuffer把list中的每个元素一个一个append然后输出的……

这样真的简化了太多的代码,而且实现难度变得低了不少。看来写代码还是要多动脑子。

不过唯一的好处是研究了一下ArrayWritable的源码,同时自己实现了这个父类,也算是有所收获

import org.apache.hadoop.io.ArrayWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.WritableFactories;
/**
* 自己实现ArrayWritable类,直接用好像会出问题
* @author wmxl
*
*/
class TextArrayWritable extends ArrayWritable { //父类其实有一个private的value,可以直接用那个,具体看ArrayWritable源码
private Text[] myValue = new Text[0]; public Text[] getMyValue() { return myValue;
} public void setMyValue(Text[] myValue) {
this.myValue = myValue;
} //这两个构造方法一定要实现TextArrayWritable() 和 TextArrayWritable(String[] strings) 而且里面要写super(Text.class)
public TextArrayWritable() {
super(Text.class);
} public TextArrayWritable(String[] strings) { super(Text.class);
Text[] texts = new Text[strings.length]; for (int i = 0; i < strings.length; i++) {
texts[i] = new Text(strings[i]);
}
// set(texts); //这个是set父类的value
setMyValue(texts);
} @Override
public void readFields(DataInput in) throws IOException { //这两个方法都是copy父类的,稍作改动,看的不是很懂
myValue = new Text[in.readInt()]; // construct values
for (int i = 0; i < myValue.length; i++) {
Text value = (Text) WritableFactories.newInstance(Text.class);
value.readFields(in); // read a value
myValue[i] = value; // store it in values
}
} @Override
public void write(DataOutput out) throws IOException { //同上
out.writeInt(myValue.length); // write values
for (int i = 0; i < myValue.length; i++) {
myValue[i].write(out);
}
} /**
* 重写这个方法,让最后write文件中的结果是你想要的样子
*/
@Override
public String toString() { StringBuffer result = new StringBuffer(); for(int i =0; i < this.getMyValue().length; i++){
if(i == this.getMyValue().length -1)
result.append(this.getMyValue()[i].toString());
else
result.append(this.getMyValue()[i].toString()).append(",");
} return result.toString();
} public void add(String friend){
int len = getMyValue().length;
Text[] newValue = new Text[len + 1];
for(int i = 0; i < len + 1; i++){
if(i < len)
newValue[i] = getMyValue()[i];
else
newValue[i] = new Text(friend);
} myValue = newValue;
}
/**
* 自己写的添加元素方法
* @param friend
*/
public void add(Text friend){
int len = getMyValue().length;
Text[] newValue = new Text[len + 1];
for(int i = 0; i < len + 1; i++){
if(i < len)
newValue[i] = getMyValue()[i];
else
newValue[i] = new Text(friend);
} myValue = newValue;
}
}

参考了这篇文章:https://www.cnblogs.com/yancey/p/3946513.html

Hadoop 中的 ArrayWritable的更多相关文章

  1. Hadoop 中利用 mapreduce 读写 mysql 数据

    Hadoop 中利用 mapreduce 读写 mysql 数据   有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...

  2. Hadoop中客户端和服务器端的方法调用过程

    1.Java动态代理实例 Java 动态代理一个简单的demo:(用以对比Hadoop中的动态代理) Hello接口: public interface Hello { void sayHello(S ...

  3. [转] - hadoop中使用lzo的压缩

    在hadoop中使用lzo的压缩算法可以减小数据的大小和数据的磁盘读写时间,不仅如此,lzo是基于block分块的,这样他就允许数据被分解成chunk,并行的被hadoop处理.这样的特点,就可以让l ...

  4. Hadoop中WritableComparable 和 comparator

    1.WritableComparable 查看HadoopAPI,如图所示: WritableComparable继承自Writable和java.lang.Comparable接口,是一个Writa ...

  5. hadoop中常见元素的解释

    secondarynamenode 图: secondarynamenode根据文件的的大小对namenode的编辑日志和镜像日志 进行合并. 光从字面上来理解,很容易让一些初学者先入为主的认为:Se ...

  6. Hadoop中常用的InputFormat、OutputFormat(转)

    Hadoop中的Map Reduce框架依赖InputFormat提供数据,依赖OutputFormat输出数据,每一个Map Reduce程序都离不开它们.Hadoop提供了一系列InputForm ...

  7. hadoop中Text类 与 java中String类的区别

    hadoop 中 的Text类与java中的String类感觉上用法是相似的,但两者在编码格式和访问方式上还是有些差别的,要说明这个问题,首先得了解几个概念: 字符集: 是一个系统支持的所有抽象字符的 ...

  8. hadoop 中对Vlong 和 Vint的压缩方法

    hadoop 中对java的基本类型进行了writeable的封装,并且所有这些writeable都是继承自WritableComparable的,都是可比较的:并且,它们都有对应的get() 和 s ...

  9. Hadoop中两表JOIN的处理方法(转)

    1. 概述 在传统数据库(如:MYSQL)中,JOIN操作是非常常见且非常耗时的.而在HADOOP中进行JOIN操作,同样常见且耗时,由于Hadoop的独特设计思想,当进行JOIN操作时,有一些特殊的 ...

随机推荐

  1. 使用keytool生成ssl证书

    使用keytool生成ssl证书 在项目中由于要使用https访问项目,然后了解到jdk有一个自带的工具keytool可以用来生成ssl证书,从而可以通过https进行访问. 使用keytool生成s ...

  2. react 利用react-hammerjs插件实现滑动特效和点击特效

    react-hammerjs是一款由hammer.js的JS插件来实现在react中实现手势滑动的事件插件, 它有各种各样的手势支持效果,这里我们就使用下它最简单的3种效果来实现我们要的动画 分别是点 ...

  3. Ngnix 安装常见错误的处理

    错误:   解决方案:(联网下) 出现上面的问题是由于没有c++编译器造成 # yum -y install gcc-c++   使用上面的命令即可安装c++解决问题 如果确实c编译器,使用如下命令解 ...

  4. Python的扩展接口[1] -> 串口通信

    串口通信 / Serial Communication 1 串口简介 / Serial Introduction 串行接口(Serial Interface)简称串口,通常为COM接口,数据发送方式为 ...

  5. NOI2016 高中OI生涯的最后一站

    你乘坐的航班XXX已经抵达终点站——四川绵阳. “呼——”机舱外的天空灰沉沉的,不禁有些压抑与紧张. 一出机场,就看见南山中学的牌子,黄色衣服的志愿者们,还有热情的老师们. 感觉刚才的情绪又一扫而空了 ...

  6. linux-启动脚本-souce与sh

    source:        在当前shell程序中执行,  因此当前shell程序中的变量和环境变量,均可见.   执行的脚本,能更新到当前shell程序. sh:            开启一个新 ...

  7. Android开发之onCreate

    最近看了一些开发人员做的APP开发,虽然都实现了比较完美的功能,不过很多地方很是牵强!我觉得:作为一个合格软件工程师,最重要的不是你写过多少代码,而是你研究过多少代码!所以,我更倡导多研究系统原本定制 ...

  8. Word中设置所有西文字体为新罗马

    如图所示,不用一个一个设置,在字体里直接设置细纹字体:Times New Roman ,中文字体不用管.

  9. DOM系统学习-基础

    DOM介绍  DOM介绍: D 网页文档 O 对象,可以调用属性和方法 M 网页文档的树型结构  节点: DOM将树型结构理解为由节点组成.     节点种类: 元素节点.文本节点.属性节点等 查找元 ...

  10. VUE -- JSONP的诞生、原理及应用实例

    问题: 页面中有一个按钮,点击之后会更新网页中的一个盒子的内容. Ajax可以很容易的满足这种无须刷新整个页面就可以实现数据变换的需求. 但是,Ajax有一个缺点,就是他不允许跨域请求资源. 如果我的 ...