scala - как вывести тип возвращаемого значения - PullRequest
0 голосов
/ 07 сентября 2018

Не могли бы вы объяснить мне, как вы выводите тип возврата? увидеть ниже. благодарю вас.

   val examples = sc.textFile(params.input).map { line =>
          Vectors.dense(line.split(' ').map(_.toDouble))
        }

[EDIT] Я имею в виду, как вы выводите тип результата. благодарю вас.

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Тип вывода работает с обратной стороны.

sc.textFile(file).map { line => Vectors.dense(line.split(' ').map(_.toDouble)) }

Последний метод, вызванный в вашем основном выражении, - RDD.map(lambda), который возвращает RDD[whatever the lambda returns].

Vectors.dense(line.split(' ').map(_.toDouble))

Тогда последний метод, вызываемый в основном выражении лямбды, - это Vectors.dense(doubles), который возвращает Vector.

line.split(' ').map(_.toDouble)

Наконец, эта строка не имеет значения, потому что Vector не имеет параметров типа, поэтому нечего выводить.

Итак, если поставить все вместе, тип возвращаемого значения - RDD [Vector].

Тип выражения - это тип его последнего оцениваемого фрагмента кода. Если это метод с параметрами типа, в данном случае RDD.map[B], то параметр типа B выводится из выражения, используемого для привязки этого параметра.

Зачем обратно вперед? Вот вам пример.

def method[T](value:T) = {    
  val a = value    
  val b = a    
  val c = b    
  c 
}

method("Foo")

method("Foo") возвращает строку, потому что от начала до конца => тип c, который имеет тип b, который имеет тип a, который имеет значение типа, который имеет тип T, и, наконец, T имеет тип String.

0 голосов
/ 07 сентября 2018

Вместо этого преобразуйте его в DenseVector, чтобы определить правильный тип возврата

import org.apache.spark.mllib.linalg.{DenseVector, Vectors}
import org.apache.spark.rdd.RDD

val examples: RDD[DenseVector] = sc.textFile(file).map { line =>
        Vectors.dense(line.split(' ').map(_.toDouble)).toDense
}
...