2016-08-16 2 views
4

Я пишу UDAF для применения к столбцу фрейма данных Spark типа Vector (spark.ml.linalg.Vector). Я полагаюсь на пакет spark.ml.linalg, так что мне не нужно идти туда и обратно между dataframe и RDD.Проблема с VectorUDT при использовании Spark ML

Внутри 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) 

VectorUDT является то, что я хотел бы использовать с spark.mllib.linalg.Vector: 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 

Ожидается ли/предлагается ли вам обходной путь?

Я использую Спарк 2.0.0

ответ

16

В Спарк 2.0.0, правильный путь заключается в использовании org.apache.spark.ml.linalg.SQLDataTypes.VectorType вместо VectorUDT. Он был введен в this issue.

+0

Это должен быть принятый ответ. – zero323