Java Hadoop-如何发出两个DarrayWritable
我正在从mapper发出两个DarrayWritable。我已经实现了扩展TwoDArrayWritable的类,以便生成默认构造函数。但当我尝试发射它时,它会给我以下异常:Java Hadoop-如何发出两个DarrayWritable,java,hadoop,mapreduce,multidimensional-array,writable,Java,Hadoop,Mapreduce,Multidimensional Array,Writable,我正在从mapper发出两个DarrayWritable。我已经实现了扩展TwoDArrayWritable的类,以便生成默认构造函数。但当我尝试发射它时,它会给我以下异常: Error: java.lang.RuntimeException: java.lang.InstantiationException: org.apache.hadoop.io.TwoDArrayWritable at org.apache.hadoop.io.TwoDArrayWritable.read
Error: java.lang.RuntimeException: java.lang.InstantiationException: org.apache.hadoop.io.TwoDArrayWritable
at org.apache.hadoop.io.TwoDArrayWritable.readFields(TwoDArrayWritable.java:75)
at org.apache.hadoop.io.serializer.WritableSerialization$WritableDeserializer.deserialize(WritableSerialization.java:71)
我如何发出两个DarrayWritable?我需要一些帮助
下面是扩展TwoDArrayWritable的类:
public class TwoDArrayWritables extends TwoDArrayWritable
{
public TwoDArrayWritables() {
super(TwoDArrayWritable.class);
}
public TwoDArrayWritables(Class valueClass) {
super(valueClass);
// TODO Auto-generated constructor stub
}
这是地图绘制者:
public class JaccardMapper extends Mapper<LongWritable, Text, IntTextPair, TwoDArrayWritables> {
Hashtable movieInfo = new Hashtable<String, String>();
String[] genres, actors, entities;
String[] attributes = new String[] {"genre", "actors", "directors", "country", "year", "ratings"};
double p,q,r,s;
double result = 0.0;
String input[] = null;
Set<String> keys;
TwoDArrayWritables array2d = new TwoDArrayWritables();
//TwoDArrayWritable array2d = new TwoDArrayWritable(IntWritable.class);
IntWritable[][] jaccard = new IntWritable[2][];
//int[][] jaccard = new int[2][];
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException
{
p = 0;
q = 0;
r = 0;
s = 0;
input = value.toString().toLowerCase().split(",");
keys = movieInfo.keySet();
//the jaccards 2d array column length depends on the user input best case is 6 but the worst case depends on the sub attributes count like more than one actor/director/genre/country.
int columnlength = input[1].split("\\|").length + input[2].split("\\|").length + input[3].split("\\|").length + input[4].split("\\|").length + 2;
jaccard = new IntWritable[2][columnlength];
for (int i = 0; i < jaccard.length; i++)
{
for (int j = 0; j < jaccard[i].length; j++)
{
jaccard[i][j] = new IntWritable(0);
}
}
if (input.length > 0)
{
//iterate through the dataset in cache
for(String keyy : keys)
{
//iterate to user's input attributes
for (int attribute = 1; attribute < attributes.length; attribute++)
{
if (!input[attribute].equals("-"))
{
entities = input[attribute].toLowerCase().split("\\|");
int subattributecount = 0;
for(String entity : entities)
{
subattributecount += 1;
}
}
}
IntTextPair pair = new IntTextPair(Integer.parseInt(input[0].toString()), movieInfo.get(keyy).toString());
array2d.set(jaccard);
context.write(pair, array2d);
}
}
}
}
公共类JaccardMapper扩展了Mapper{
Hashtable movieInfo=新的Hashtable();
字符串[]类型、演员、实体;
字符串[]属性=新字符串[]{“流派”、“演员”、“导演”、“国家”、“年份”、“评级”};
双p,q,r,s;
双结果=0.0;
字符串输入[]=null;
设置关键点;
TwoDArrayWritables数组2d=新TwoDArrayWritables();
//TwoDArrayWritable array2d=新的TwoDArrayWritable(IntWritable.class);
IntWritable[]]jaccard=新的IntWritable[2][];
//int[][]jaccard=新int[2][];
公共void映射(LongWritable键、文本值、上下文上下文)引发IOException、InterruptedException
{
p=0;
q=0;
r=0;
s=0;
输入=value.toString().toLowerCase().split(“,”);
keys=movieInfo.keySet();
//jaccards 2d数组列长度取决于用户输入最佳情况为6,但最坏情况取决于子属性计数,如多个演员/导演/流派/国家。
int columnlength=input[1]。拆分(\\\\\;”)。长度+输入[2]。拆分(\\\\\;”)。长度+输入[3]。拆分(\\\\\\;”)。长度+输入[4]。拆分(\\\\\\\;”)。长度+2;
jaccard=新的IntWritable[2][columnlength];
对于(int i=0;i0)
{
//在缓存中遍历数据集
for(字符串keyy:keys)
{
//迭代到用户的输入属性
for(int属性=1;属性
这是减速器:
公共类减速机扩展减速机{
double p,q,r,s;
double result = 0.0;
//IntWritable[][] jaccard = null;
IntWritable[][] jaccard;
int temp1 = 0, temp2 = 0;
//Jaccard distance 1.0 emplies that the user's criteria doesn't meet at all
public static final double nonacceptvalue = 1.0;
public void reduce(IntTextPair key, Iterable<TwoDArrayWritables> values, Context context) throws IOException, InterruptedException
{
IntDoublePair pair = new IntDoublePair(key.getFirst().get(), Double.parseDouble("110.00"));
for (TwoDArrayWritable value : values)
{
if (value != null)
{
context.write(pair, new Text("Is not null"));
}
else
{
context.write(pair, new Text("Is null"));
}
}
}
}
双p,q,r,s;
双结果=0.0;
//IntWritable[]jaccard=null;
IntWritable[]jaccard;
int temp1=0,temp2=0;
//Jaccard distance 1.0使用了用户的标准根本不符合的功能
公共静态最终双不可接受值=1.0;
public void reduce(IntTextPair键、Iterable值、上下文)抛出IOException、InterruptedException
{
IntDoublePair=新的IntDoublePair(key.getFirst().get(),Double.parseDouble(“110.00”);
for(TwoDArrayWritable值:值)
{
if(值!=null)
{
write(成对,新文本(“不为空”);
}
其他的
{
write(成对,新文本(“为空”);
}
}
}
}
在默认构造函数(super)中指定的类应该是值的类,而不是整个类本身的类。所以你可能想要:
public TwoDArrayWritables() {
super(IntWritable.class);
}
谢谢你纠正我的错误。:)