¿Cómo convertir ArrayType a DenseVector en PySpark DataFrame?

Recibo el siguiente error al intentar construir un Pipeline ML:

 pyspark.sql.utils.IllegalArgumentException: 'requirement failed: Column features must be of type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 but was actually ArrayType(DoubleType,true).' 

La columna Mis features contiene una matriz de valores de punto flotante. Parece que necesito convertirlos en algún tipo de vector (no es escaso, ¿es un DenseVector?). ¿Hay alguna forma de hacer esto directamente en el dataframe o tengo que convertirlo a un RDD?

Puedes usar UDF:

 udf(lambda vs: Vectors.dense(vs), VectorUDT()) 

En Spark <2.0 import:

 from pyspark.mllib.linalg import Vectors, VectorUDT 

En Spark 2.0+ importamos:

 from pyspark.ml.linalg import Vectors, VectorUDT 

Tenga en cuenta que estas clases no son compatibles a pesar de la implementación idéntica.

También es posible extraer características individuales y ensamblarlas con VectorAssembler . Suponiendo que la columna de entrada se llama features :

 from pyspark.ml.feature import VectorAssembler n = ... # Size of features assembler = VectorAssembler( inputCols=["features[{0}]".format(i) for i in range(n)], outputCol="features_vector") assembler.transform(df.select( "*", *(df["features"].getItem(i) for i in range(n)) ))