withcolumn tutorial spark example create scala apache-spark dataframe

scala - example - spark sql tutorial



Scala: ¿Cómo puedo reemplazar el valor en Dataframes usando scala? (4)

Por ejemplo, quiero reemplazar todos los números iguales a 0.2 en una columna a 0. ¿Cómo puedo hacer eso en Scala? Gracias

Editar :

|year| make|model| comment |blank| |2012|Tesla| S | No comment | | |1997| Ford| E350|Go get one now th...| | |2015|Chevy| Volt| null | null|

Este es mi Dataframe. Estoy intentando cambiar Tesla en make column a S


Construyendo a partir de la solución de @ Azeroth2b. Si desea reemplazar solo un par de elementos y dejar el resto sin cambios. Haz lo siguiente. Sin utilizar el método de lo contrario (...), el resto de la columna se convierte en nulo.

import org.apache.spark.sql.functions._ val newsdf = sdf.withColumn("make", when(col("make") === "Tesla", "S") .otherwise(col("make")) );

DataFrame antiguo

+-----+-----+ | make|model| +-----+-----+ |Tesla| S| | Ford| E350| |Chevy| Volt| +-----+-----+

Nuevo Datarame

+-----+-----+ | make|model| +-----+-----+ | S| S| | Ford| E350| |Chevy| Volt| +-----+-----+


Esto se puede lograr en marcos de datos con funciones definidas por el usuario (udf).

import org.apache.spark.sql.functions._ val sqlcont = new org.apache.spark.sql.SQLContext(sc) val df1 = sqlcont.jsonRDD(sc.parallelize(Array( """{"year":2012, "make": "Tesla", "model": "S", "comment": "No Comment", "blank": ""}""", """{"year":1997, "make": "Ford", "model": "E350", "comment": "Get one", "blank": ""}""", """{"year":2015, "make": "Chevy", "model": "Volt", "comment": "", "blank": ""}""" ))) val makeSIfTesla = udf {(make: String) => if(make == "Tesla") "S" else make } df1.withColumn("make", makeSIfTesla(df1("make"))).show


Nota: Como lo mencionó Olivier Girardot, esta respuesta no está optimizada y la solución withColumn es la que se debe utilizar (respuesta Azeroth2b)

No se puede borrar esta respuesta ya que ha sido aceptada.

Aquí está mi opinión sobre este:

val rdd = sc.parallelize( List( (2012,"Tesla","S"), (1997,"Ford","E350"), (2015,"Chevy","Volt")) ) val sqlContext = new SQLContext(sc) // this is used to implicitly convert an RDD to a DataFrame. import sqlContext.implicits._ val dataframe = rdd.toDF() dataframe.foreach(println) dataframe.map(row => { val row1 = row.getAs[String](1) val make = if (row1.toLowerCase == "tesla") "S" else row1 Row(row(0),make,row(2)) }).collect().foreach(println) //[2012,S,S] //[1997,Ford,E350] //[2015,Chevy,Volt]

Puedes usar el map directamente en el DataFrame .

Así que básicamente verificas la columna 1 para el String tesla . Si es tesla , use el valor S para make que usted sea el valor actual de la columna 1

Luego cree una tupla con todos los datos de la fila usando los índices (basados ​​en cero) ( Row(row(0),make,row(2)) ) en mi ejemplo)

Probablemente hay una mejor manera de hacerlo. Todavía no estoy familiarizado con el paraguas Spark


Spark 1.6.2, código Java (lo siento), esto cambiará cada instancia de Tesla a S para todo el marco de datos sin pasar por un RDD:

dataframe.withColumn("make", when(col("make").equalTo("Tesla"), "S") .otherwise(col("make") );

Editado para agregar @ marshall245 "de lo contrario" para garantizar que las columnas que no son de Tesla no se conviertan a NULL.