Ton*_*ong 28 scala dataframe apache-spark
例如,我想将列中等于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|
Run Code Online (Sandbox Code Playgroud)
这是我的Dataframe我试图将make栏中的特斯拉改为S.
Aze*_*h2b 37
Spark 1.6.2,Java代码(对不起),这将在不通过RDD的情况下将整个数据帧的每个特斯拉实例更改为S:
dataframe.withColumn("make", when(col("make").equalTo("Tesla"), "S")
.otherwise(col("make")
);
Run Code Online (Sandbox Code Playgroud)
编辑添加@ marshall245"否则"以确保非特斯拉列不会转换为NULL.
小智 23
建立@ Azeroth2b的解决方案.如果您只想更换几件物品,请保持其余部分不变.请执行下列操作.不使用否则(...)方法,列的其余部分变为空.
import org.apache.spark.sql.functions._
val newsdf = sdf.withColumn("make", when(col("make") === "Tesla", "S")
.otherwise(col("make"))
);
Run Code Online (Sandbox Code Playgroud)
旧DataFrame
+-----+-----+
| make|model|
+-----+-----+
|Tesla| S|
| Ford| E350|
|Chevy| Volt|
+-----+-----+
Run Code Online (Sandbox Code Playgroud)
新数据
+-----+-----+
| make|model|
+-----+-----+
| S| S|
| Ford| E350|
|Chevy| Volt|
+-----+-----+
Run Code Online (Sandbox Code Playgroud)
小智 14
这可以在具有用户定义函数(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
Run Code Online (Sandbox Code Playgroud)
cch*_*son 12
注意:
正如Olivier Girardot所提到的,这个答案没有优化,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]
Run Code Online (Sandbox Code Playgroud)
实际上,你可以直接使用map
的DataFrame
.
所以你基本上检查第1列的字符串tesla
.如果是 tesla
,请使用值S
进行make
其他你第1列的当前值
然后使用索引(基于零)(Row(row(0),make,row(2))
)在我的示例中使用行中的所有数据构建一个元组)
可能有更好的方法.我不熟悉Spark之伞