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.