如何将Scalding ValuePipe加入TypedPipe?

时间:2015-09-21 20:34:31

标签: scala hadoop cluster-analysis scalding

我已经调整了烫金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来表示这些值。但是我应该怎么做呢?

1 个答案:

答案 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)
  }