2017-02-06 9 views
0

I '、クラスの1つでコードを編集した後にmllib sparkモジュールをローカルにビルドしようとしました。 How to build Spark Mllib submodule individually をしかし、私はMavenを使用してモジュールをビルドする際に、結果.jarは、リポジトリ内のバージョンのようなもので、クラスは私のコードを持っていない:spark-mllibをローカルで修正してビルドする

私は、このソリューションを読みました。

BisectingKmeans.scalaクラスを修正しました。これは、github https://github.com/apache/sparkの1つのプルリクエストで行われた修正の1つが、最後のリリースジェットに含まれていないためです。

私が構築しようとしているバージョン:

/** 
    * 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) 
     } 
    } 
    } 

とビルド:これに

/** 
    * 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) 
     } 
    } 
    } 

mllib 2.11 
spark: 2.1.0 

に私はこれからBisectingKameans.scalaクラスを変更する必要があります。 しかし、私はそれを行う方法を知らない。

答えて

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というパスを持つパッケージを作成し、そこにそのクラスのコードをコピーして、新しいBisectingKMeanがアクセスできるようにします。

私は他のSpark MLlibクラスと一緒に使っていますが、この特定のものについては試していませんので、この場合に考慮すべき詳細がいくつかあるかどうかはわかりませんまたは必要なクラスをローカルに複製する必要がありますが、このようなマイナーな変更の場合は、必要なコードが多くないはずです)。

このようにすると、Spark MLlibを再構築する必要はありません。

関連する問題