Spark withColumn用于修改列但不添加新列

时间:2018-05-29 14:05:27

标签: scala apache-spark dataframe

Scala 2.12和Spark 2.2.1。我有以下代码:

myDf.show(5)
myDf.withColumn("rank", myDf("rank") * 10)
myDf.withColumn("lastRanOn", current_date())
println("And now:")
myDf.show(5)

当我运行它时,在日志中我看到:

+---------+-----------+----+
|fizz|buzz|rizzrankrid|rank|
+---------+-----------+----+
|   2|   5| 1440370637| 128|
|   2|   5| 2114144780|1352|
|   2|   8|  199559784|3233|
|   2|   5| 1522258372| 895|
|   2|   9|  918480276| 882|
+---------+-----------+----+
And now:
+---------+-----------+-----+
|fizz|buzz|rizzrankrid| rank|
+---------+-----------+-----+
|   2|   5| 1440370637| 1280|
|   2|   5| 2114144780|13520|
|   2|   8|  199559784|32330|
|   2|   5| 1522258372| 8950|
|   2|   9|  918480276| 8820|
+---------+-----------+-----+

所以,有趣的是:

  • 第一个withColumn有效,通过将自身乘以10来转换每一行的rank
  • 然而,第二个withColumn失败,只是将所有行的当前日期/时间添加为新的lastRanOn

我需要做些什么才能让lastRanOn列添加工作?

1 个答案:

答案 0 :(得分:7)

您的示例可能过于简单,因为修改rank也不起作用。

withColumn不会更新DataFrame,而是创建一个新的DataFrame。

所以你必须这样做:

// if myDf is a var
myDf.show(5)
myDf = myDf.withColumn("rank", myDf("rank") * 10)
myDf = myDf.withColumn("lastRanOn", current_date())
println("And now:")
myDf.show(5)

或者例如:

myDf.withColumn("rank", myDf("rank") * 10).withColumn("lastRanOn", current_date()).show(5)

在重新分配新的DataFrame参考

之后,您才会添加新列