使用Spark ML

时间:2016-08-16 17:53:30

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

我正在编写一个UDAF,以应用于Vector类型的Spark数据框列(spark.ml.linalg.Vector)。我依赖spark.ml.linalg包,这样我就不必在数据帧和RDD之间来回切换。

在UDAF中,我必须为输入,缓冲区和输出模式指定数据类型:

def inputSchema = new StructType().add("features", new VectorUDT())
def bufferSchema: StructType =
    StructType(StructField("list_of_similarities", ArrayType(new VectorUDT(), true), true) :: Nil)

override def dataType: DataType = ArrayType(DoubleType,true) 

我将与spark.mllib.linalg.Vector一起使用VectorUDT: https://github.com/apache/spark/blob/master/mllib/src/main/scala/org/apache/spark/mllib/linalg/Vectors.scala

但是,当我尝试从spark.ml导入它时:import org.apache.spark.ml.linalg.VectorUDT 我收到运行时错误(构建期间没有错误):

class VectorUDT in package linalg cannot be accessed in package org.apache.spark.ml.linalg 

预计/你能建议一个解决方法吗?

我正在使用Spark 2.0.0

1 个答案:

答案 0 :(得分:20)

在Spark 2.0.0中,正确的方法是使用org.apache.spark.ml.linalg.SQLDataTypes.VectorType而不是VectorUDT。它是在this issue中引入的。