必须完全知道匿名函数的参数类型。 (SLS 8.5)当word2vec申请数据帧时

时间:2016-05-13 09:32:51

标签: scala apache-spark dataframe apache-spark-mllib

我使用数据帧应用Spark的word2vec。这是我的代码:

val df2 = df.groupBy("LABEL").agg(collect_list("TERM").alias("TERM"))

    val word2Vec = new Word2Vec()
      .setInputCol("TERM")
      .setOutputCol("result")
      .setMinCount(0)

val model = word2Vec.fit(df2)
    val result = model.transform(df2)

    val synonyms = model.findSynonyms("4", 10)

    //synonyms.foreach(println)

    for((synonym, cosineSimilarity) <- synonyms) {
      println(s"$synonym $cosineSimilarity")
    }

但是,当我使用synonyms.foreach(println)代码时,返回的结果不会根据它们的相似性得分进行排序。相反,我尝试了在代码底部看到的for循环。应用它时,抛出了以下错误:

Error:(52, 40) missing parameter type for expanded function
The argument types of an anonymous function must be fully known. (SLS 8.5)
Expected type was: ?
    for((synonym, cosineSimilarity) <- synonyms) {
                                       ^

从其他类似的stackoverflow问题和错误,似乎需要确切的参数类型。在for循环中synonyms是一个数据帧,返回的值分别具有String和Double类型。所以我的所有试验都失败了。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

findSynonyms的结果是非物化的Spark内部DataFrame。你不能简单地迭代结果。

  def findSynonyms(word: Vector, num: Int): DataFrame = {
    ..
    sc.parallelize(wordVectors.findSynonyms(word, num)).toDF("word", "similarity")
  }

请注意,foreach工作的原因是DataFrame上明确定义的具体化方法