hadoop ArrayWritable实现自定义类

感觉网上的博客对于如何重写arraywritable并不是很详细,自己重新整理了一下,如何使用arraywritable存放复杂类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class MyArrayWritable extends ArrayWritable { 
public MyArrayWritable() {
super(SomeComplexClass.class); //首先构造函数中写需要存放的对象的类
}
}

public MyArrayWritable(String[] strings) {

super(SomeComplexClass.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
}


//由于是自定义的对象,因此需要写toString函数。
//否则在存入的时候会存入对象的地址,而不是想要的信息。

public String toString() {
StringBuilder sb = new StringBuilder();
//使用this.get()获取strings的长度
for (int i = 0; i < this.get().length; i++) {
//some code
}
return sb.toString();
}

//最后在reduce的时候,就可以存入一个array的value了。

//例如这样,在reduce时,有一个复杂对象的values。可以用arraylist将其加入,最后变成string数组放到MyArrayWritable中。
ArrayList<String> al = new ArrayList<String>();
for (SomeComplexClass val : values) {
al.add(val.toString());
}

context.write(key, new MyArrayWritable((String[]) al.toArray(new String[al.size()])));
Jie wechat
学就完事