【发布时间】:2016-10-22 19:13:15
【问题描述】:
我正在尝试扩展或代理 org.apache.spark.ml.clustering.KMeans 类,以便授权 K=1。
class K1Means extends Estimator{
final val kmeans = new KMeans()
val k = 1
override def setK(value:Int) {
if(value >1){
this.kmeans.setK(value)
}
}
override def fit(dataset: DataFrame): KMeansModel = {
if(this.k == 1){
/* super specific to my case */
val avg_sample = Vectors.zeros(
dataset
.select("scaledFeatures")
.take(1)(0)(0) // first row
.asInstanceOf[DenseVector] // was of type Any
.size
) // with the scaling the average value of each column is 0
var centers_local = Array(avg_sample)
return new KMeansModel(centers_local)
}
else{
return this.kmeans.fit(dataset)
}
}
// every method then calls this.kmeans.method()
}
我已经尝试过了,但是 new KMeansModel(centers_local) 没有被授权,因为 KMeansModel 有一个私有构造函数。
这是错误消息:
constructor KMeansModel in class KMeansModel cannot be accessed in class K1Means
我也尝试扩展 KMeansModel,所以我可以创建自己的并返回它:
class K1MeansModel(centers: Array[DenseVector]) extends KMeansModel{}
但它也失败了:constructor KMeansModel in class KMeansModel cannot be accessed in class K1MeansModel
【问题讨论】:
-
文档似乎不同意你的观点:spark.apache.org/docs/1.6.0/api/java/org/apache/spark/ml/… 在我看来是公开的
-
你能编辑你的问题并提供实际的错误信息吗?
-
好的,我得改一下。构造函数是私有的,也许是正确的说法。它只能由 KMeans 实例化。
标签: scala inheritance private proxy-classes