Apache spark 大量窗口功能(滞后、超前)导致内存溢出

Apache spark 大量窗口功能(滞后、超前)导致内存溢出,apache-spark,window-functions,Apache Spark,Window Functions,我需要使用多个lead和lag从数据集中计算附加功能。超前和滞后的数量过多会导致内存不足错误 数据帧: |----------+----------------+---------+---------+-----+---------| | DeviceID | Timestamp | Sensor1 | Sensor2 | ... | Sensor9 | |----------+----------------+---------+---------+-----+---------|

我需要使用多个lead和lag从数据集中计算附加功能。超前和滞后的数量过多会导致内存不足错误

数据帧:

|----------+----------------+---------+---------+-----+---------|
| DeviceID | Timestamp      | Sensor1 | Sensor2 | ... | Sensor9 |
|----------+----------------+---------+---------+-----+---------|
|          |                |         |         |     |         |
| Long     | Unix timestamp | Double  | Double  |     | Double  |
|          |                |         |         |     |         |
|----------+----------------+---------+---------+-----+---------|
窗口定义:

// Each window contains about 600 rows
val w = Window.partitionBy("DeviceID").orderBy("Timestamp") 
计算额外功能:

var res = df
val sensors = (1 to 9).map(i => s"Sensor$i")

for (i <- 1 to 5) {
  for (s <- sensors) {
    res = res.withColumn(lag(s, i).over(w))
         .withColumn(lead(s, i)).over(w)
  }

  // Compute features from all the lag's and lead's
  [...]
}
该代码对小数据集给出了正确的结果,但对10GB的输入数据给出了内存不足错误。 我认为罪魁祸首是大量的窗口函数,因为DAG显示了一个非常长的序列

Window -> WholeStageCodeGen -> Window -> WholeStageCodeGen ...
是否有更有效的方法计算相同的特征? 例如,是否可以在不调用lag(…,1)九次的情况下获得lag(传感器1,1)、lag(传感器2,1)、…、lag(传感器9,1)


如果上一个问题的答案是否定的,那么我如何避免内存不足?我已经尝试增加分区的数量。

您可以尝试以下方法

res = res.select('*', lag(s"Sensor$1", 1).over(w), lag(s"Sensor$1", 2).over(w), ...)
也就是说,要在
中写入所有内容,请选择
,而不是使用列


那么计划中只有一个窗口。也许这有助于提高性能。

从来没有听说过
窗口上的
groupBy
,你是说
partitionBy
?@RaphaelRoth:是的,我是说partitionBy。我对问题进行了编辑以反映这一点。
res = res.select('*', lag(s"Sensor$1", 1).over(w), lag(s"Sensor$1", 2).over(w), ...)