2016-09-29 4 views
1

Spark mapToPair() 함수에서 DefaultMutableTreeNode 변수의 값을 사용하면 기본값이 기본값으로 바뀝니다. 여기 내 코드는 다음과 같습니다DefaultMutableTreeNode 값을 Spark mapToPair에 사용할 때 기본값으로 설정합니다.

public class CA implements Serializable{ 
    private final JavaRDD<String> input; 
    private final List<IB> bList; 
    public boolean FuncWithSpark(){ 
    /* 
    !!!at this point, bList.get(0).getD().getRoot() return a valid tree node 
    */ 
    JavaRDD<Boolean> counters = input.mapToPair(new PairFunction<String, String, List<String>>() { 
      @Override 
      public Tuple2<String, List<String>> call(String s) throws Exception { 
       /* 
       !!!at this point, bList.get(0).getD().getRoot() return an uninitialized tree node with default values 
       */ 
       ... 
      } 
     } 
    } 

    public CA(JavaRDD<String> input, List<IB> bList) { 
     this.input = input; 
     this.bList = bList; 
    } 
} 

인터페이스 IB, ID, 클래스 CB와 CD는 다음과 같이 정의된다 :

public interface IB { 
    ... 
} 
public interface ID { 
    ... 
} 

public class CB implements IB, Serializable{ 
    private final ID d; 
    public ID getD(){ 
     return this.d; 
    } 
} 
public class CD implements ID, Serializable{ 
    private DefaultMutableTreeNode rootNode; 

    public DefaultMutableTreeNode getRoot(){ 
     return this.rootNode; 
    } 
} 

질문) (CA.FuncWithSpark에서 형의 DefaultMutableTreeNode의 변수에 무슨 일이 있었는지, 무엇입니까? 그것은 Spark 변환 때문입니까, 아니면 DefaultMutableTreeNode의 멤버 변수가 보호되어 있고 그것들에 접근자가 없습니까? 이 문제를 해결할 방향을 알려주십시오. 사전에 도움을 주셔서 감사합니다!.

답변

0

Apache Spark를 처음 사용하고 DefaultMutableTreeNode 클래스를 사용하는 것은 처음이기 때문에 근본 원인을 설명 할 수는 없지만 코드를 작동시키는 방법을 찾았습니다. DefaultMutableTreeNode의 문서 이것은 스레드 안전 클래스이 아니기 때문에 드라이버에서 안전하지 않은 스레드 유형의 변수를 실행 프로그램에 전달하면 값이 올바르게 전달되지 않을 수 있습니다.

그러나 내 프로젝트에는 트리 노드와 같은 데이터 구조가 필요하므로 stackoverflow에이 일반 tree node 구현이 DefaultMutableTreeNode를 대체한다는 것을 알았습니다. 이제 제 코드가 잘 작동합니다.

관련 문제