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