es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para convertir df en un conjunto de vectores densos, necesitamos seguir estos pasos:

    1. Convertir cada fila de df en un Vector utilizando el método Vectors.dense.
    2. Agregar cada vector al conjunto.

    Para manejar el problema de que las columnas de df sean de tipo Int, necesitamos convertirlas a Double. Esto se puede lograr utilizando el método cast en cada columna.

    Aquí está el código que logra el resultado deseado:

    import org.apache.spark.ml.linalg.DenseVector
    import org.apache.spark.ml.feature.VectorAssembler
    
    // Convertir las columnas Int a columnas Double
    val dfDouble = df.select(df.columns.map(c => col(c).cast("double")): _*)
    
    // Convertir el DataFrame en un conjunto de Vectores Densos
    val arrayDenseVectors = dfDouble.rdd.map(row => Vectors.dense(row.toSeq.toArray)).collect()
    

    Explicación:
    1. Importamos las clases DenseVector y VectorAssembler.
    2. Creamos un nuevo DataFrame llamado dfDouble, donde utilizamos el método select para convertir cada columna a Double.
    3. Utilizamos la transformación rdd.map para mapear cada fila de dfDouble en un vector denso utilizando el método Vectors.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.

Comments are closed.