使用window函数时,如何理解spark错误消息中的"e:"和"columnsName&



我有一个非常简单的代码,比如

val win = Window.partitionBy("app").orderBy("date")
val appSpendChange = appSpend
.withColumn("prevSpend", lag(col("Spend")).over(win))
.withColumn("spendChange", when(isnull($"Spend" - "prevSpend"), 0)
.otherwise($"spend" - "prevSpend"))
display(appSpendChange)

这应该像我引用的PySpark示例一样工作,并将其更改为scala:PySpark列转换:计算列中每组的百分比变化

然而,我得到了这个错误:

error: overloaded method value lag with alternatives:
(e: org.apache.spark.sql.Column,offset: Int,defaultValue: Any,ignoreNulls: Boolean)org.apache.spark.sql.Column <and>
(e: org.apache.spark.sql.Column,offset: Int,defaultValue: Any)org.apache.spark.sql.Column <and>
(columnName: String,offset: Int,defaultValue: Any)org.apache.spark.sql.Column <and>
(columnName: String,offset: Int)org.apache.spark.sql.Column <and>
(e: org.apache.spark.sql.Column,offset: Int)org.apache.spark.sql.Column
cannot be applied to (org.apache.spark.sql.Column)
.withColumn("prevPctSpend", lag(col("pctCtvSpend")).over(win))
^

我该如何理解它?尤其是e:注释?感谢并感谢任何反馈。

您应该理解以下错误:

  • 有5个方法lag定义为以下参数和返回类型((<parameters>)<return>:
    • (e: org.apache.spark.sql.Column,offset: Int,defaultValue: Any,ignoreNulls: Boolean)org.apache.spark.sql.Column
    • (e: org.apache.spark.sql.Column,offset: Int,defaultValue: Any)org.apache.spark.sql.Column
    • (columnName: String,offset: Int,defaultValue: Any)org.apache.spark.sql.Column
    • (columnName: String,offset: Int)org.apache.spark.sql.Column
    • (e: org.apache.spark.sql.Column,offset: Int)org.apache.spark.sql.Column
  • 这些可能性都不能应用于类型为(org.apache.spark.sql.Column)的参数(您编写的代码(

最后,这意味着您调用了一个参数丢失或无效的方法。

正如@Dima所说,您可能希望在对lag的调用中添加第二个参数(offset(。