2016-09-29 9 views
1

У меня вопрос, что значение переменной DefaultMutableTreeNode по умолчанию используется для использования в функции Spark mapToPair(). Вот мой код:Значение 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; 
    } 
} 

Вопрос в том, что случилось с переменной типа DefaultMutableTreeNode в CA.FuncWithSpark()? Это из-за преобразования Spark, или переменные-члены DefaultMutableTreeNode защищены и не имеют доступа к ним? Пожалуйста, дайте мне направление для решения этой проблемы. Благодарим вас за любую помощь заранее !.

ответ

0

Поскольку я новичок в Apache Spark, и это был мой первый случай использования класса DefaultMutableTreeNode, я не могу объяснить основную причину, но я нашел способ заставить мой код работать. В документе DefaultMutableTreeNode упоминается . Это не безопасный по потоку класс, что заставляет меня думать в Spark, передавая переменные типа, которые являются небезопасными от драйвера к исполнителям, могут не правильно передавать значения.

Однако для моего проекта нужна структура данных, такая как узел дерева, поэтому я нашел эту общую реализацию tree node на stackoverflow, чтобы заменить DefaultMutableTreeNode. Теперь мой код работает хорошо.