Tengo un dataframe que ha columnas alrededor de 400, quiero soltar 100 columnas, como por mi requisito.
Así que he creado un Scala Lista de los 100 nombres de columna.
Y luego quiero para iterar a través de un bucle for para eliminar realmente la columna en cada iteración del bucle.

A continuación está el código.

final val dropList: List[String] = List("Col1","Col2",...."Col100”)

def drpColsfunc(inputDF: DataFrame): DataFrame = { 
    for (i <- 0 to dropList.length - 1) {
        val returnDF = inputDF.drop(dropList(i))
    }
    return returnDF
}

val test_df = drpColsfunc(input_dataframe) 

test_df.show(5)
  • Estoy recibiendo un error de compilación que no se pudo resolver «returnDF». ¿Alguien puede por favor ayudar a solucionar este problema.
  • Por favor hacer la pregunta de auto-contenida. ¿Por qué se pone de parte de su pregunta en los comentarios? ¿Cómo puedo hacer una buena pregunta?
  • Por favor, editar su pregunta con la información adicional se ha añadido en los comentarios !
  • Martin y Eliasah-Hecho los cambios en la pregunta. Gracias
  • El problema que me estaba enfrentando con el código anterior, estoy recibiendo un error de compilación que «no se pudo resolver «returnDF'». ¿Alguien puede por favor ayudar a solucionar este problema.
  • En realidad creo que no podemos hacer de esta manera. La razón es, dataframe sí mismo no se puede afirmar desde su inmutable no puede ser cambiado. Me refiero a que cuando uno se quita la columna de la nueva dataframe se crea en la primera iteración y cuando en la siguiente iteración el dataframe es todavía el viejo.
  • En el nuevo Spark Versión de 2.0, creo que hemos API disponible para colocar los múltiples columnas de la lista mediante una instrucción drop.
  • Me corrigió este problema utilizando el código de la fuente apache-spark-user-list.1001560.n3.nabble.com/…
  • val colsToRemove = Seq(«colA», «colby», «colC», etc) val filteredDF = df.seleccione(df.columnas .filtro(colName => !colsToRemove.contiene(colName)) .mapa(colName => nueva Columna(colName)): _*)

InformationsquelleAutor Ramesh | 2016-09-30

4 Comentarios

  1. 16

    Respuesta:

    val colsToRemove = Seq("colA", "colB", "colC", etc) 
    
    val filteredDF = df.select(df.columns .filter(colName => !colsToRemove.contains(colName)) .map(colName => new Column(colName)): _*) 
    • Funciona bien. Podría por favor elaborar el significado de «_*» aquí ?
    • en : _* : si sabes python es similar al desempaquetar el operador unario * pones en frente de una lista por ejemplo. La expresión de arriba antes de : _* es una secuencia de Column (más precisamente, de una Array[Column]), pero (una forma de) select espera un varargs campo de Column, es decir. un número variable de Column objetos. Véase, por ejemplo: alvinalexander.com/scala/…
    • O simplemente puede hacer stackoverflow.com/a/54003514/1439913.
  2. 15

    Si usted sólo quiere hacer nada más compleja que la de caer varias columnas nombradas, frente a la selección de ellos por una condición particular, usted puede simplemente hacer lo siguiente:

    df.drop("colA", "colB", "colC")
  3. 2

    Esto debería funcionar bien :

    val dropList : List[String]  |
    val df : DataFrame  |
    val test_df = df.drop(dropList : _*) 
  4. 0

    Puedes hacer,

    def dropColumns(inputDF: DataFrame, dropList: List[String]): DataFrame = 
        dropList.foldLeft(inputDF)((df, col) => df.drop(col))

    Le devolverá el DataFrame sin las columnas pasado en dropList.

    Como un ejemplo (de lo que está sucediendo detrás de la escena), déjame ponerlo de esta manera.

    scala> val list = List(0, 1, 2, 3, 4, 5, 6, 7)
    list: List[Int] = List(0, 1, 2, 3, 4, 5, 6, 7)
    
    scala> val removeThese = List(0, 2, 3)
    removeThese: List[Int] = List(0, 2, 3)
    
    scala> removeThese.foldLeft(list)((l, r) => l.filterNot(_ == r))
    res2: List[Int] = List(1, 4, 5, 6, 7)

    La lista devuelta (en nuestro caso, el mapa a su DataFrame) es el más reciente de filtrado. Después de cada una de las veces, la última se pasa a la función siguiente (_, _) => _.

Dejar respuesta

Please enter your comment!
Please enter your name here