IncompatibleSchemaException:以Avro格式序列化时出现意外类型VectorUDT

时间:2017-03-16 15:32:07

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

我使用Spark Mllib为我的数据生成预测,然后以Avro格式将它们存储到HDFS:

val dataPredictions = myModel.transform(myData)
val output = dataPredictions.select("is", "probability", "prediction")
output.write.format("com.databricks.spark.avro").save(path)

我收到以下例外:

com.databricks.spark.avro.SchemaConverters$IncompatibleSchemaException:
    Unexpected type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7.

我的理解是'预测'列格式无法序列化为Avro。

  • 如何将VectorUDT转换为数组,以便我可以在Avro中对其进行序列化?
  • 有没有更好的选择(我不能放弃Avro格式)?

1 个答案:

答案 0 :(得分:0)

要将任何Vector转换为Array[Double],您可以使用以下UDF:

import org.apache.spark.sql.functions.udf
import org.apache.spark.sql.functions.col
import org.apache.spark.ml.linalg.Vector

val vectorToArrayUdf = udf((vector: Vector) => vector.toArray)

// The following will work
val output = dataPredictions
    .withColumn("probabilities", vectorToArrayUdf(col("probability")))
    .select("id", "probabilities", "prediction")

output.write.format("com.databricks.spark.avro").save(path)