2015-04-16 156 views
1

我是新来Scala和我与练了K-means算法从k-means斯卡拉:类型不匹配错误

的教程中,我通过这个教程的这一部分混淆以下:

var newCentroids = pointsGroup.mapValues(ps => average(ps)).collectAsMap() 

这导致类型不匹配错误,因为功能average需要Seq,而我们给它一个Iterable。我怎样才能解决这个问题?什么导致了这个错误?

+1

我认为教程在火花0.9.0时写入当['groupByKey'返回'RDD [(K,Seq [V])]'](https://spark.apache.org/docs/0.9.0/api/core/index.html#org.apache .spark.rdd.PairRDDFunctions)while [现在它给了我们'RDD [(K,Iterable [V])]'](https://spark.apache.org/docs/latest/api/scala/index.h tml#org.apache.spark.rdd.PairRDDFunctions) – Odomontois

回答

2

我们可以很容易地在Iterable提供解决方案取代Seqaverage功能:

def average(ps: Iterable[Vector]) : Vector = { 
    val numVectors = ps.size 
    var out = new Vector(ps.head.elements) 
    ps foreach (out += _) 
    out/numVectors 
} 

甚至在不断的空间:

def average(ps: Iterable[Vector]): Vector = { 
    val numVectors = ps.size 

    val vSize = ps.head.elements.length 

    def element(index: Int): Double = ps.map(_(index)).sum/numVectors 

    new Vector(0 until vSize map element toArray) 
} 
+0

你的回答太棒了!如果你可以,你可以推荐一些轻量级的书或其他的东西,我可以得到关于scala的入门级的想法吗?我搜索了网页,并得到一堆信息,这让我感到困惑 –

+1

@G_cy有很多方法可以在http://www.scala-lang.org/documentation/ 如果你想要我的愚见 - 得到一些IDE提供诸如Intellij IDEA和scala插件的技巧,并执行小型实际任务,同时潜藏文档并在这里提问 语言创建者的[本课程](https://www.coursera.org/course/progfun)也很棒 – Odomontois

+0

那我在做什么。你认为Intellij比日食好吗?我正在使用eclipse,并且遇到了不同的有线问题。这让我发疯。 –

4

那么SeqIterable的子类型,但反之亦然,所以在类型系统中不可能转换这些类型。

通过编写average(ps.toSeq)有一个明确的转换可用。此转换将迭代Iterable并将项目收集到Seq

+0

thx为您的答案!可以向我推荐一些有效的文章,以获得有关scala的重要信息。有人向我推荐这本书:scala为不耐烦的人。这是一个不错的选择吗? –

+0

做两个coursera类(从函数式编程开始),然后继续编写代码,阅读语言创建者的书,开始阅读文档,学习一些用scala写的关于您感兴趣的领域的库(akka, specs,finagle,kafka,scalaz,spark ......)。开始通过manning编写“scala中的函数式编程”一书(它经常出售50%)。 – uberwach

+0

你也可以加入freenode IRC上的#scala频道,人们会在那里为你提供帮助,并且有关从初学者到专家级别的话题的有趣讨论。 – uberwach