¿Cómo convertir un DataFrame a un arreglo de vectores densos?
¿Cómo convertiría el siguiente DataFrame en un Array de vectores densos?
val df = Seq(
(5.0, 1.0, 1.0, 3.0, 7.0),
(2.0, 0.0, 3.0, 4.0, 5.0),
(4.0, 0.0, 0.0, 6.0, 7.0)).toDF("m1", "m2", "m3", "m4", "m5")
//df: res166: org.apache.spark.sql.DataFrame = [m1: int, m2: int ... 3 more fields]
a un Array de vectores densos
val arrayDenseVectors = Array(
Vectors.dense(5.0, 1.0, 1.0, 3.0, 7.0),
Vectors.dense(2.0, 0.0, 3.0, 4.0, 5.0),
Vectors.dense(4.0, 0.0, 0.0, 6.0, 7.0))
//arrayDenseVectors: Array[org.apache.spark.mllib.linalg.Vector] = Array([5.0,1.0,1.0,3.0,7.0], [2.0,0.0,3.0,4.0,5.0], [4.0,0.0,0.0,6.0,7.0])
Para complicar aún más el problema, las columnas de df son de tipo Int
en lugar de Double
.
davy.ai
Para convertir
df
en un conjunto de vectores densos, necesitamos seguir estos pasos:df
en unVector
utilizando el métodoVectors.dense
.Para manejar el problema de que las columnas de df sean de tipo
Int
, necesitamos convertirlas aDouble
. Esto se puede lograr utilizando el métodocast
en cada columna.Aquí está el código que logra el resultado deseado:
Explicación:
1. Importamos las clases
DenseVector
yVectorAssembler
.2. Creamos un nuevo DataFrame llamado
dfDouble
, donde utilizamos el métodoselect
para convertir cada columna aDouble
.3. Utilizamos la transformación
rdd.map
para mapear cada fila dedfDouble
en un vector denso utilizando el métodoVectors.dense
.4. Utilizamos la acción
collect
para convertir el RDD en un conjunto.Ahora,
arrayDenseVectors
es un conjunto de vectores densos, que debería ser equivalente a la salida deseada.