我已经调整了烫金KMeans示例来做KModes。问题是,当作业完成时,我需要将聚集的记录与匹配的质心连接起来。 KMeans代码使用ValuePipe来保存质心。 因此,为了将质心从ValuePipe中取出,我将其平面化。 然后我这样做了加入:
HVKModes(500000,inputSets,10).waitFor(Config.default,mode) match {
case Success((a,centroids: ValuePipe[List[LabeledCentroid]], points: TypedPipe[LabeledVector])) => {
val joined = centroids
.flatMap {
cs : List[LabeledCentroid] => {
val t = TypedPipe.from(cs)
Iterator(points.join(t)) }
}
.values
.write(clusteredOutput)
}
case Failure(e) => sys.error("problem running job:" + e.toString)
}
问题是编译器在"值"上给出了类型错误。行:
Cannot prove that com.twitter.scalding.typed.CoGrouped[Int,((String, Set[String]), Set[String])] <:< (Any, V).
[error] .values
我认为错误表明它无法弄清楚我所采用的V来表示这些值。但是我应该怎么做呢?
答案 0 :(得分:1)
我几乎把它弄好了。我只需要加入flatmapping的结果。
HVKModes(500000,inputSets,10).waitFor(Config.default,mode) match {
case Success((a,centroids: ValuePipe[List[LabeledCentroid]], points: TypedPipe[LabeledVector])) => {
val cs =
centroids
.flatMap {
cs : List[LabeledCentroid] => { cs.toIterator}
}
points
.join(cs)
.values
.write(clusteredOutput)
}
case Failure(e) => sys.error("problem running job:" + e.toString)
}