在Spark数据框

时间:2016-09-10 00:22:35

标签: apache-spark spark-dataframe window-functions

简而言之,在下面的示例中,我想将' 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))
  }

1 个答案:

答案 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)