我有一个现成的函数用来做一些计算
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_01
和c_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,但仍然不起作用。有谁能帮帮我吗?
1条答案
按热度按时间dtcbnfnu1#
pow
中使用的整个表达式应该是固定值或Column
。(1.0*days - $"set_days")/days
表达式是Column
和固定值的混合,更具体地说,您正在固定值和Column
之间使用操作-
,这是不受支持的。这就是错误消息所说的:-
不能作为第二个操作数应用于Column
。您应该使用
lit
将固定值 Package 在Column
中: