Scala: Как я могу заменить значение в Dataframes, используя Scala

Например, я хочу заменить все числа, равные 0,2 в столбце, на 0. Как это сделать в Scala? Спасибо

Редактировать:

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

Это мой Dataframe, я пытаюсь изменить Тесла в колонке make на S

4 ответа

Решение

Примечание: как упоминал Оливье Жирардо, этот ответ не оптимизирован и withColumn решение - это то, что нужно использовать (ответ Azeroth2b)

Не могу удалить этот ответ, так как он был принят


Вот мой взгляд на это:

 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]

Вы можете использовать непосредственно map на DataFrame,

Таким образом, вы в основном проверяете столбец 1 для строки tesla, Если это tesla, используйте значение S за make иначе вы текущее значение столбца 1

Затем создайте кортеж со всеми данными из строки, используя индексы (начиная с нуля) (Row(row(0),make,row(2))) в моем примере)

Вероятно, есть лучший способ сделать это. Я еще не очень знаком с зонтиком Spark

Spark 1.6.2, Java-код (извините), это изменит каждый экземпляр Tesla на S для всего кадра данных без прохождения через RDD:

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

Отредактировано, чтобы добавить @marshall245 "иначе", чтобы столбцы не Теслы не конвертировались в NULL.

Построение решения от @Azeroth2b. Если вы хотите заменить только пару элементов, а остальные оставить без изменений. Сделайте следующее. Без использования метода иначе (...) остальная часть столбца становится нулевой.

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

Старый DataFrame

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

Новый Датарам

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

Это может быть достигнуто в фреймах данных с пользовательскими функциями (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

df2.na.replace("Имя", Карта ("Джон" -> "Акшай", "Синди" -> "Джайита")).show()

заменить в классе DataFrameNaFunctions типа [T](col: String, замена: Map[T,T])org.apache.spark.sql.DataFrame

Для запуска этой функции у вас должен быть активный искровой объект и информационный кадр с включенными заголовками.

import org.apache.spark.sql.functions._

val base_optin_email = spark.read.option("header","true").option("delimiter",",").schema(schema_base_optin).csv(file_optin_email).where("CPF IS NOT NULL").
        withColumn("CARD_KEY",  lit(translate( translate(col("cpf"), ".", ""),"-","")))
Другие вопросы по тегам