this is my post from stackoverflow
but i am not getting any response.
I need to emit a 2D double array as key and value from mapper.There are
questions posted in stackoverflow. But they are not answered.
we have to create a custom datatype.but how?I am new to these custom
datatypes. i dnt have any idea where to start.I am doing some of the matrix
multiplication in a given dataset.and after that i need to emit the value of
A*Atrns which will be a matrix and Atrans*D which will also be a matrix.so
how to emit these matrices from mapper.And the value should be
corresponding to the key itself.I think for that we need to use
WritableComparable.
public class MatrixWritable implements WritableComparable<MatrixWritable>{
/**
* @param args
*/
private double[][] value;
public MatrixWritable() {
// TODO Auto-generated constructor stub
set(new double[0][0]);
}
public MatrixWritable(double[][] value) {
// TODO Auto-generated constructor stub
this.value = value;
}
public void set(double[][] value) {
this.value = value;
}
public double[][] getValue() {
return value;
}
@Override
public void write(DataOutput out) throws IOException {
System.out.println("write");
int row=0;
int col=0;
for(int i=0; i<value.length;i++){
row = value.length;
for(int j=0; j<value[i].length; j++){
col = value[i].length;
}
}
out.writeInt(row);
out.writeInt(col);
System.out.println("\nTotal no of observations: "+row+":"+col);
for(int i=0;i<row ; i++){
for(int j= 0 ; j< col;j++){
out.writeDouble(value[i][j]);
}
}
//priting array
for(int vali =0;vali< value.length ;vali ++){
for(int valj = 0;valj <value[0].length;valj++){
System.out.print(value[vali][valj]+ "\t");
}
System.out.println("");
}
}
@Override
public void readFields(DataInput in) throws IOException {
int row = in.readInt();
int col = in.readInt();
double[][] value = new double[row][col];
for(int i=0;i<row ; i++){
for(int j= 0 ; j< col;j++){
value[i][j] = in.readDouble();
}
}
}
@Override
public int hashCode() {
}
@Override
public boolean equals(Object o) {
}
@Override
public int compareTo(MatrixWritable o) {
// TODO Auto-generated method stub
return 0;
}
@Override
public String toString() {
return Arrays.toString(value);
}
}
I wrote matrix write,readfields and toString.
1.But my toString is not returning anything. why is it so?
2.How to print these values with in Reducer ?I tried doing(tried with
emiting only custom value- for checking)
public class MyReducer extends
Reducer<MatrixWritable, MatrixWritable, IntWritable, Text> {
public void reduce(Iterable<MatrixWritable> key,
Iterable<MatrixWritable> values, Context context){
for(MatrixWritable c : values){
System.out.println("print value "+c.toString());
}
}
but Nothing is printing.when i tried to print value[0].length in toString()
method it showsArrayIndexOutOfBoundExcep.Am i doing any thing wrong.and i
also needed to print my data asmatrix so i tried
public String toString() {
String separator = ", ";
StringBuffer result = new StringBuffer();
// iterate over the first dimension
for (int i = 0; i < value.length; i++) {
// iterate over the second dimension
for(int j = 0; j < value[i].length; j++){
result.append(value[i][j]);
System.out.print(value[i][j]);
result.append(separator);
}
// remove the last separator
result.setLength(result.length() - separator.length());
// add a line break.
result.append("\n");
}
return result.toString();
}
Again my output is empty. 3.Inorder to emit a key too as custom datatype
CompareTo is neccessary right .
4.so what should i include in that methods CompareTo,hashcode,equals and
what are these methods intended for.
Any Idea.Pls suggest a solution.
--
*Thanks & Regards*
*
*
Unmesha Sreeveni U.B*
*
*Junior Developer
*
*Amrita Center For Cyber Security
*
*
Amritapuri.
www.amrita.edu/cyber/
*