Scala: как заменить значение в Dataframes с помощью scala
Например, я хочу заменить все числа равными 0,2 в столбце на 0. Как это сделать в Scala? Благодаря
Edit
|year| make|model| comment |blank|
|2012|Tesla| S | No comment | |
|1997| Ford| E350|Go get one now th...| |
|2015|Chevy| Volt| null | null|
Это мой Dataframe. Я пытаюсь изменить Tesla в столбце make на S
Ответы
Ответ 1
Примечание:
Как упоминалось Оливье Жирардо, этот ответ не оптимизирован, и решение 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
Ответ 2
Spark 1.6.2, Java-код (извините), это изменит каждый экземпляр Tesla на S для всего кадра данных без прохождения через RDD:
dataframe.withColumn("make", when(col("make").equalTo("Tesla"), "S")
.otherwise(col("make")
);
Отредактировано, чтобы добавить @marshall245 "иначе", чтобы столбцы, отличные от Теслы, не конвертировались в NULL.
Ответ 3
Построение решения от @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|
+-----+-----+
Ответ 4
Это может быть достигнуто в dataframes с определенными пользователем функциями (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
Ответ 5
df2.na.replace("Имя", Карта ("Джон" → "Акшай", "Синди" → "Джайита")). show()
заменить в классе DataFrameNaFunctions типа [T] (col: String, замена: Map [T, T]) org.apache.spark.sql.DataFrame
Для запуска этой функции у вас должен быть активный искровой объект и информационный кадр с включенными заголовками.