Объявите StructType Dataframe: столбец, содержащий org. apache .spark.ml.linalg.Vector - PullRequest
0 голосов
/ 26 марта 2020

У меня есть DataFrame с именем df1 со следующей схемой:

root
 |-- instances: string (nullable = true)
 |-- features: vector (nullable = true)
 |-- label: double (nullable = false)

Где features и label были получены из LabeledPoint. Я хотел бы создать новый DataFrame, но с изменением содержимого instances и features. Для этого я пишу следующее:

val schema2 = new StructType()
  .add("instances", "string")
  .add("features", "org.apache.spark.ml.linalg.Vector")  // also I've tried using `vector`
  .add("label", "double")

val schemaEncoder = RowEncoder(schema2)

val df2 = df1.map {
  case Row(inst: String, lp: org.apache.spark.ml.linalg.Vector, lbl: Double) => {
    val nInst = modifyInstances(inst)
    val nLP = nInst.split(",")
    Row(nInst, nLP, lbl)
  }
}(schemaEncoder)

Когда я запускаю код, проблема будет в .add("features", "org.apache.spark.ml.linalg.Vector")

Любое предложение?

1 Ответ

1 голос
/ 26 марта 2020

Вам необходимо указать DataType как org.apache.spark.ml.linalg.SQLDataTypes.VectorType, как показано ниже:

import org.apache.spark.sql.types._
import org.apache.spark.ml.linalg.SQLDataTypes._

val schema2 = new StructType().
  add("instances", StringType).
  add("features", VectorType).
  add("label", DoubleType)
// schema2: org.apache.spark.sql.types.StructType = StructType(
//   StructField(instances,StringType,true),
//   StructField(features,org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7,true),
//   StructField(label,DoubleType,true)
// )
...