web-dev-qa-db-fra.com

Scala: Comment remplacer la valeur dans les cadres de données avec scala

Par exemple, je veux remplacer tous les nombres égaux à 0,2 dans une colonne par 0. Comment puis-je le faire dans Scala? Merci

Edit:

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

Ceci est mon Dataframe J'essaye de changer Tesla dans la colonne make en S

27
Tong

Note: Comme mentionné par Olivier Girardot, cette réponse n'est pas optimisée et la solution withColumn est celle à utiliser (réponse Azeroth2b)

Impossible de supprimer cette réponse car elle a été acceptée


Voici mon point de vue sur celui-ci:

 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]

Vous pouvez en fait utiliser directement map sur le DataFrame.

Donc, en gros, vous vérifiez la colonne 1 pour la chaîne tesla. S'il s'agit de tesla, utilisez la valeur S pour make sinon vous utilisez la valeur actuelle de la colonne 1

Puis construisez un tuple avec toutes les données de la ligne en utilisant les index (base zéro) (Row(row(0),make,row(2))) dans mon exemple)

Il y a probablement une meilleure façon de le faire. Je ne connais pas encore très bien le Spark

12
ccheneson

Spark 1.6.2, Java (désolé), cela changera chaque instance de Tesla en S pour l’ensemble de la trame de données sans passer par un RDD:

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

Edité pour ajouter @ marshall245 "sinon" pour s'assurer que les colonnes non-Tesla ne sont pas converties en NULL.

36
Azeroth2b

Construire à partir de la solution de @ Azeroth2b. Si vous souhaitez remplacer uniquement quelques éléments et laisser le reste inchangé. Faites ce qui suit. Sans utiliser la méthode sinon (...), le reste de la colonne devient nul.

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

Ancien DataFrame

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

Nouveau Datarame

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

Ceci peut être réalisé dans des cadres de données avec des fonctions définies par l'utilisateur (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
12
Al M

df2.na.replace ("Nom", Carte ("John" -> "Akshay", "Cindy" -> "Jayita")). show ()

replace dans la classe DataFrameNaFunctions de type [T] (col: String, replacement: Map [T, T]) org.Apache.spark.sql.DataFrame

Pour exécuter cette fonction, vous devez avoir activé spark, objet et dataframe avec en-tête ON.

0
Akshay Pandya