Scala 如何在向dataframe动态添加列时避免序列化错误?

Scala 如何在向dataframe动态添加列时避免序列化错误?,scala,dataframe,apache-spark,serialization,Scala,Dataframe,Apache Spark,Serialization,我试图迭代一个列名列表,其中包含要使用窗口函数进行排序的列,并添加一个新列,该列的结果为源列的顶部值。为此,我将输入dataframe声明为for循环外的变量,并在循环内更新它。这导致任务不可序列化,据我所知,这可能是因为varialbe df在主节点上声明,而for循环试图在工作节点上访问它。我是否可以使用相同的逻辑避免此错误,或者是否有一种添加这些列的不同方法 def getHighestScoredAttributes(scoredDF: DataFrame, attributes: A

我试图迭代一个列名列表,其中包含要使用窗口函数进行排序的列,并添加一个新列,该列的结果为源列的顶部值。为此,我将输入dataframe声明为for循环外的变量,并在循环内更新它。这导致任务不可序列化,据我所知,这可能是因为varialbe df在主节点上声明,而for循环试图在工作节点上访问它。我是否可以使用相同的逻辑避免此错误,或者是否有一种添加这些列的不同方法

 def getHighestScoredAttributes(scoredDF: DataFrame, attributes: Array[String]) : DataFrame = {
    var df = scoredDF
    for (attribute <- attributes) {
      val maxValidWindow = Window.partitionBy(df("druid")).orderBy(
        when(df("validity") === lit("valid"), lit(1)).otherwise(lit(0)).desc,
        when(df(attribute).isNotNull, lit(1)).otherwise(lit(0)).desc,
        df("rank").desc_nulls_last)
      val maxInvalidWindow = Window.partitionBy(df("druid")).orderBy(
        when(df("validity") === lit("invalid"), lit(1)).otherwise(lit(0)).desc,
        when(df(attribute).isNotNull, lit(1)).otherwise(lit(0)).desc,
        df("rank").desc_nulls_last)
      df = df.withColumn("valid_" + attribute, first(attribute) over maxValidWindow)
        .withColumn("valid_" + attribute + "_dt", first("attest_dt") over maxValidWindow)
        .withColumn("invalid_" + attribute, first(attribute) over maxInvalidWindow)
        .withColumn("invalid_" + attribute + "_dt", first("attest_dt") over maxInvalidWindow)
    }
    df
  }
def getHighestScoredAttributes(scoredDF:DataFrame,attributes:Array[String]):DataFrame={
var df=分数DDF

对于(属性发现问题不在于上面的代码,而在于orderby中的rank列。它在该函数的作用域之外用一个window函数声明,但在函数体中惰性地求值,从而导致此错误。用@transient标记该window val可以解决此问题。

是否可以添加错误和错误的堆栈跟踪编码如何称呼您
def