注意:
正如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]
您实际上可以直接在DataFrame上使用map.
所以你基本上检查了第1列的String tesla.
如果是特斯拉,请使用值S for make else,然后使用第1列的当前值
然后使用索引(基于零)(我的示例中的Row(row(0),make,row(2)))构建一个包含行中所有数据的元组
可能有更好的方法.我不熟悉Spark之伞