[HADOOP] 감속기에서 동일하게 반복 할 하둡에 TwoDArrayWritable을 사용자 정의하지 수
HADOOP감속기에서 동일하게 반복 할 하둡에 TwoDArrayWritable을 사용자 정의하지 수
매퍼에서 값 2 배 차원 배열을 방출하려고. 입력으로서 2 차원 어레이 - 하둡에서는 1 소요 TwoDArrayWritable있다. 내 유스 케이스를 달성하기 위해, 나는 2의 입력을 할 TwoDArrayWritable을 편집하려고 - 2 차원 배열을
/**
* A Writable for 2D arrays containing a matrix of instances of a class.
*/
public class MyTwoDArrayWritable implements Writable {
private Class valueClass;
private Writable[][] values;
private Class valueClass1;
private Writable[][] values1;
public MyTwoDArrayWritable(Class valueClass,Class valueClass1) {
this.valueClass = valueClass;
this.valueClass1 = valueClass1;
}
public MyTwoDArrayWritable(Class valueClass, DoubleWritable[][] values,Class valueClass1, DoubleWritable[][] values1) {
this(valueClass, valueClass1);
this.values = values;
this.values1 = values1;
}
public Object toArray() {
int dimensions[] = {values.length, 0};
Object result = Array.newInstance(valueClass, dimensions);
for (int i = 0; i < values.length; i++) {
Object resultRow = Array.newInstance(valueClass, values[i].length);
Array.set(result, i, resultRow);
for (int j = 0; j < values[i].length; j++) {
Array.set(resultRow, j, values[i][j]);
}
}
return result;
}
/**
* @return the valueClass
*/
public Class getValueClass() {
return valueClass;
}
/**
* @param valueClass the valueClass to set
*/
public void setValueClass(Class valueClass) {
this.valueClass = valueClass;
}
/**
* @return the values
*/
public Writable[][] getValues() {
return values;
}
/**
* @param values the values to set
*/
public void setValues(DoubleWritable[][] values,DoubleWritable[][] values1) {
this.values = values;
this.values = values1;
}
/**
* @return the valueClass1
*/
public Class getValueClass1() {
return valueClass1;
}
/**
* @param valueClass1 the valueClass1 to set
*/
public void setValueClass1(Class valueClass1) {
this.valueClass1 = valueClass1;
}
/**
* @return the values1
*/
public Writable[][] getValues1() {
return values1;
}
public void readFields(DataInput in) throws IOException {
// construct matrix
values = new Writable[in.readInt()][];
for (int i = 0; i < values.length; i++) {
values[i] = new Writable[in.readInt()];
}
// construct values
for (int i = 0; i < values.length; i++) {
for (int j = 0; j < values[i].length; j++) {
Writable value; // construct value
try {
value = (Writable) valueClass.newInstance();
} catch (InstantiationException e) {
throw new RuntimeException(e.toString());
} catch (IllegalAccessException e) {
throw new RuntimeException(e.toString());
}
value.readFields(in); // read a value
values[i][j] = value; // store it in values
}
}
}
public void write(DataOutput out) throws IOException {
out.writeInt(values.length); // write values
for (int i = 0; i < values.length; i++) {
out.writeInt(values[i].length);
}
for (int i = 0; i < values.length; i++) {
for (int j = 0; j < values[i].length; j++) {
values[i][j].write(out);
}
}
}
}
그리고 매퍼에서 2 차원 double 배열을 emited.
MyTwoDArrayWritable array = new MyTwoDArrayWritable (DoubleWritable.class,DoubleWritable.class);
DoubleWritable[][] myInnerArray = new DoubleWritable[EtransEkey.length][EtransEkey[0].length];
DoubleWritable[][] myInnerArray1 = new DoubleWritable[EtransDevalue.length][EtransDevalue[0].length];
// set values in myInnerArray
for (int k1 = 0; k1 < EtransEkey.length; k1++) {
for(int j1=0;j1< EtransEkey[0].length;j1++){
myInnerArray[k1][j1] = new DoubleWritable(EtransEkey[k1][j1]);
}
}
for (int k1 = 0; k1 < EtransDevalue.length; k1++) {
for(int j1=0;j1< EtransDevalue[0].length;j1++){
myInnerArray1[k1][j1] = new DoubleWritable(EtransDevalue[k1][j1]);
}
}
array.set(myInnerArray,myInnerArray1);
array.set에 에러 표시 (myInnerArray, myInnerArray1);
/*
* The method set(DoubleWritable[][], DoubleWritable[][]) is undefined for the type MyTwoDArrayWritableritable
*/
편집 : 어떻게 myInnerArray 매트릭스와 myInnerArray1 행렬을 얻을 수 감속기에서이 값을 반복하는?
지금까지 내가 무슨 짓을
for (MyTwoDArrayWritable c : values) {
System.out.println(c.getValues());
DoubleWritable[][] myInnerArray = new DoubleWritable[KdimRow][KdimCol];
for (int k1 = 0; k1 < KdimRow; k1++) {
for(int j1=0;j1< KdimCol;j1++){
myInnerArray[k1][j1] = new DoubleWritable();
}
}
하지만 어떻게 이중 배열에 다시 저장하는 방법?
해결법
-
==============================
1.해당 오류가 표시되는 이유 당신은 MyTwoDArrayWritable에서 set 메소드를 정의하지 않은, 즉. 대신 array.set를 호출, 당신은 이미 당신이 필요로 정확히 않는 정의 된 방법을 사용한다 : setValues를, 그래서 교체
해당 오류가 표시되는 이유 당신은 MyTwoDArrayWritable에서 set 메소드를 정의하지 않은, 즉. 대신 array.set를 호출, 당신은 이미 당신이 필요로 정확히 않는 정의 된 방법을 사용한다 : setValues를, 그래서 교체
array.set(myInnerArray,myInnerArray1);
와
array.setValues(myInnerArray,myInnerArray1);
from https://stackoverflow.com/questions/24904782/customizing-twodarraywritable-in-hadoop-and-not-able-to-iterate-the-same-in-redu by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] RDD [목록 [문자열] 문자열에 도착하고 분할하는 방법 (0) | 2019.10.07 |
---|---|
[HADOOP] 하이브 / 하둡은 Oozie를 사용으로 임시 쿼리를 예약 (0) | 2019.10.07 |
[HADOOP] 돼지 라틴어 스크립트를 실행하는 동안 예외를 얻기 (0) | 2019.10.07 |
[HADOOP] 하둡 스트리밍 : 어디 응용 프로그램 로그는? (0) | 2019.10.07 |
[HADOOP] 하둡 네임 노드, 체크 포인트 노드 및 백업 노드를 사용의 장점과 단점은 무엇입니까? (0) | 2019.10.07 |