Scala Spark DataFrame Map Encoder не примитивного типа - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть фрейм данных Scala Spark (переменная df):

id, values
"a", [0.5, 0.6]
"b", [0.1, 0.2]
...

Я пытаюсь использовать RowMatrix для эффективного вычисления парного косинусного сходства.

final case class dataRow(id: String, values: Array[Double])

val rows = df.as[dataRow].map {
  row => {
        Vectors.dense(row.values)
    }
}.rdd

У меня следующая ошибка компиляции

Unable to find encoder for type stored in a Dataset.  Primitive types (Int, String, etc) and Product types (case classes) are supported by importing spark.implicits._ 

В конце концов я смогу это сделать (RowMatrix требуется RDD [Vector])

val mat = new RowMatrix(rows)

У меня естьуже импортирован spark.implicits_, что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Просто не существует неявного кодировщика для Vector типов.Так что либо нажмите на карту после `rdd

val rows = df.as[dataRow].rdd.map(row => Vectors.dense(row.values))

или укажите Encoder

import org.apache.spark.sql.Encoder
import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder

ds.as[dataRow].map(x => Vectors.dense(x.values))(ExpressionEncoder(): Encoder[Vector])
0 голосов
/ 12 февраля 2019

Какой объект Векторов вы используете?

Попробуйте импортировать контекст linalg.Внутри библиотек могут быть конфликты.

Также переместите объект домена класса case за пределы области действия вашей функции, а затем удалите final

import org.apache.spark.mllib.linalg.{Vectors, Vector}
import org.apache.spark.mllib.linalg.distributed.RowMatrix

case class DataRow(id: String, values: Array[Double])


def func(spark: SparkSession, df: DataFrame): RowMatrix = {
   import spark.implicits._

   val rows = df.as[DataRow]
      .map(row => Vectors.dense(row.values))
      .rdd

   val mat = new RowMatrix(rows)
   mat
}
...