Scala:如何使用scala替换Dataframe中的值

时间:2015-09-02 15:55:39

标签: scala apache-spark dataframe

例如,我想将列中等于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

6 个答案:

答案 0 :(得分:36)

Spark 1.6.2,Java代码(对不起),这将在不通过RDD的情况下将整个数据帧的每个特斯拉实例更改为S:

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

编辑添加@ marshall245"否则"确保非特斯拉列不会转换为NULL。

答案 1 :(得分:21)

建立@ 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|
+-----+-----+

答案 2 :(得分:12)

注意: 正如Olivier Girardot所提到的,这个答案没有得到优化,withColumn解决方案就是使用(艾泽拉斯回答)

无法删除此答案,因为它已被接受

以下是我对此的看法:

 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之伞

答案 3 :(得分:12)

这可以在具有用户定义函数(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

答案 4 :(得分:0)

df2.na.replace(“ Name”,Map(“ John”->“ Akshay”,“ Cindy”->“ Jayita”))。show()

在类DataFrameNaFunction中替换类型为[T](col:字符串,替换:Map [T,T])org.apache.spark.sql.DataFrame的函数

要运行此功能,必须具有活动的Spark对象和带有标题为ON的数据框。

答案 5 :(得分:0)

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"), ".", ""),"-","")))