2017-02-06 2 views
0

I ', пытаясь построить модуль искры mllib локально после редактирования кода в одном из классов.Модифицировать и построить искро-mllib локально

Я прочитал это решение: How to build Spark Mllib submodule individually Но когда я создаю модуль, используя Maven, результат .jar подобен версии в хранилище и класс не мой код.

Я модифицировал класс BisectingKmeans.scala, потому что одно из исправлений, сделанных в однопользовательском запросе github https://github.com/apache/spark, не находится в последнем выпуске струи.

версия Я пытаюсь построить:

mllib 2.11 
spark: 2.1.0 

мне нужно изменить BisectingKameans.scala класс от этого:

/** 
    * Updates assignments. 
    * @param assignments current assignments 
    * @param divisibleIndices divisible cluster indices 
    * @param newClusterCenters new cluster centers 
    * @return new assignments 
    */ 
    private def updateAssignments(
     assignments: RDD[(Long, VectorWithNorm)], 
     divisibleIndices: Set[Long], 
     newClusterCenters: Map[Long, VectorWithNorm]): RDD[(Long, VectorWithNorm)] = { 
    assignments.map { case (index, v) => 
     if (divisibleIndices.contains(index)) { 
     val children = Seq(leftChildIndex(index), rightChildIndex(index)) 
     val selected = children.minBy { child => 
      KMeans.fastSquaredDistance(newClusterCenters(child), v) 
     } 
     (selected, v) 
     } else { 
     (index, v) 
     } 
    } 
    } 

Для этого:

/** 
    * Updates assignments. 
    * @param assignments current assignments 
    * @param divisibleIndices divisible cluster indices 
    * @param newClusterCenters new cluster centers 
    * @return new assignments 
    */ 
    private def updateAssignments(
     assignments: RDD[(Long, VectorWithNorm)], 
     divisibleIndices: Set[Long], 
     newClusterCenters: Map[Long, VectorWithNorm]): RDD[(Long, VectorWithNorm)] = { 
    assignments.map { case (index, v) => 
     if (divisibleIndices.contains(index)) { 
     val children = Seq(leftChildIndex(index), rightChildIndex(index)) 
     val newClusterChildren = children.filter(newClusterCenters.contains(_)) 
     if (newClusterChildren.nonEmpty) { 
      val selected = newClusterChildren.minBy { child => 
      KMeans.fastSquaredDistance(newClusterCenters(child), v) 
      } 
      (selected, v) 
     } else { 
      (index, v) 
     } 
     } else { 
     (index, v) 
     } 
    } 
    } 

и строить. Но я не знаю, как это сделать.

ответ

0

Я хотел бы создать еще один класс, который расширяет класс, который вы хотите изменить:

class MyBisectingKmeans extends BisectingKMeans { 
    override private def updateAssignments(
           assignments: RDD[(Long, VectorWithNorm)], 
           divisibleIndices: Set[Long], 
           newClusterCenters: Map[Long, VectorWithNorm]): RDD[(Long, VectorWithNorm)] = { 
    assignments.map { case (index, v) => 
     if (divisibleIndices.contains(index)) { 
     val children = Seq(leftChildIndex(index), rightChildIndex(index)) 
     val newClusterChildren = children.filter(newClusterCenters.contains(_)) 
     if (newClusterChildren.nonEmpty) { 
      val selected = newClusterChildren.minBy { child => 
      KMeans.fastSquaredDistance(newClusterCenters(child), v) 
      } 
      (selected, v) 
     } else { 
      (index, v) 
     } 
     } else { 
     (index, v) 
     } 
    } 
    } 
} 

Некоторые классы, используемые в этом методе являются частными (например, VectorWithNorm), поэтому для доступа к тем, в вашем проекте вы могли бы создайте пакет с контуром org.apache.spark.mllib.clustering и скопируйте код этого класса, чтобы ваши новые BisectingKMeans могли получить к нему доступ.

Я сделал это с другими классами Spark MLlib, я не пробовал его для этого конкретного, поэтому я не уверен, есть ли в этом случае некоторые более конкретные детали (частные методы или необходимые классы должны быть дублированы локально, но для незначительных изменений, подобных этому, не должно быть такого большого количества кода).

Выполняя это так, вам не нужно восстанавливать Spark MLlib.

Смежные вопросы