scala 更改来自列的值的固定值会导致错误:重载方法值-使用替换项

sbdsn5lh  于 2022-11-09  发布在  Scala
关注(0)|答案(1)|浏览(178)

我有一个现成的函数用来做一些计算

def calculateFund(cColName: String, inst: Int)(df: DataFrame): DataFrame = {
  val colsToSelect = df.columns.toSeq

  val days = 30
  val cSeq = Seq("c_01", "c_02")

  df
    .withColumn("amount_ta", lit(1.0) - col(cColName))
    .withColumn("high_pmr", round(pow(lit(1.0) + $"funding_ca" + $"funding_pa", lit(1.0/12)) - lit(1.0), 4))
    .withColumn("rate_mpo", $"high_pmr" + lit(1.0))
    .withColumn("amount_pi", $"amount_ta"/lit(inst))
    .withColumn("c_01", lit(-1.0)*when(lit(1) <= lit(inst), (pow($"rate_mpo", (1.0*days-1)/days) - lit(1.0))*$"amount_pi").otherwise(0.0))
    .withColumn("c_02", lit(-1.0)*when(lit(2) <= lit(inst), (pow($"rate_mpo", (2.0*days-1)/days) - lit(1.0))*$"amount_pi").otherwise(0.0))
    .withColumn(cColName, round(cSeq.map(col).reduce(_ + _), 4))
    .select(colsToSelect.map(col):_*)
}

使用函数示例

df.transform(calculateFund("credit_col", 1))

它工作得很好,但我需要更改c_01c_02中的固定值,并使用Column条件来使用来自名为set_days的列的值

之前:(1.0*days-1)/days)
之后:(1.0*days - $"set_days")/days)

因此,在这个减法中,我尝试使用来自set_days列的值,而不是使用固定的1
当我尝试像在上面的示例中那样直接放置该列时,我收到了这个错误

error: overloaded method value - with alternatives:
  (x: Double)Double <and>
  (x: Float)Double <and>
  (x: Long)Double <and>
  (x: Int)Double <and>
  (x: Char)Double <and>
  (x: Short)Double <and>
  (x: Byte)Double
 cannot be applied to (org.apache.spark.sql.Column)

我已经尝试在函数调用上设置一个val,但仍然不起作用。有谁能帮帮我吗?

dtcbnfnu

dtcbnfnu1#

pow中使用的整个表达式应该是固定值或Column
(1.0*days - $"set_days")/days表达式是Column和固定值的混合,更具体地说,您正在固定值和Column之间使用操作-,这是不受支持的。这就是错误消息所说的:-不能作为第二个操作数应用于Column
您应该使用lit将固定值 Package 在Column中:

(lit(1.0*days) - $"set_days") / lit(days)

相关问题