简而言之,在下面的示例中,我想将' b固定为结果将出现在行中的值。
Given:
a,b
1,2
4,6
3,7 ==> 'special would be: (1-7 + 4-7 + 3-7) == -13 in this row
val baseWin = Window.partitionBy("something_I_forgot").orderBy("whatever")
val sumWin = baseWin.rowsBetween(-2, 0)
frame.withColumn("special",sum( 'a - 'b ).over(win) )
或者另一种想到它的方法是我想在计算总和时关闭该行,以便我可以传入' b的值(在这种情况下为7)
*更新* 这是我想要作为UDF完成的。简而言之,我使用了foldLeft。
def mad(field : Column, numPeriods : Integer) : Column = {
val baseWin = Window.partitionBy("exchange","symbol").orderBy("datetime")
val win = baseWin.rowsBetween(numPeriods + 1, 0)
val subFunc: (Seq[Double],Int) => Double = { (input: Seq[Double], numPeriods : Int) => {
val agg = grizzled.math.stats.mean(input: _*)
val fooBar = (1.0 / -numPeriods)*input.foldLeft(0.0)( (a,b) => a + Math.abs((b-agg)) )
fooBar
} }
val myUdf = udf( subFunc )
myUdf(collect_list(field.cast(DoubleType)).over(win),lit(numPeriods))
}
答案 0 :(得分:0)
如果我理解你正在尝试做什么,我认为你可以重构一下你的逻辑来实现它。你现在拥有它的方式,你可能得到“-7”而不是-13。
对于“特殊”栏,(1-7 + 4-7 + 3-7),你可以像(sum(a) - count(*)* b)那样计算:
dfA.withColumn("special",sum('a).over(win) - count("*").over(win) * 'b)