窗口函数中的多重计算

时间:2018-05-31 17:39:15

标签: scala apache-spark

在spark中,我试图在同一个窗口中计算三个事务。由于我有另一个例子多次使用相同的窗口,因此需要花费太多时间。我缩短了我的例子,如下所示。是否可以在一个窗口函数中执行此操作,如下所示。正如预期的那样抛出错误......

val sonuc = data.withColumn("meanError",
  struct(mean($"errorGeneral"),min($"errorGeneral")).over(
  Window.partitionBy($"id").orderBy($"time".asc).rangeBetween(-240*3600,
  0)))

感谢。

1 个答案:

答案 0 :(得分:0)

没有错:

val w = Window.partitionBy($"id").orderBy($"time".asc).rangeBetween(-240*3600, 0)

data.select($"*"
  mean($"errorGeneral").over(w),
  min($"errorGeneral").over(w)
)

内部Spark必须洗牌并且只需订购一次。

如果这很慢,那是因为窗口函数是Spark中最昂贵的操作的顶部,特别是像这样的宽帧。