我需要使用多个潜在客户和滞后来计算数据集中的其他要素。大量的引线和延迟会导致内存不足错误。
数据框:
|----------+----------------+---------+---------+-----+---------|
| 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
[...]
}
系统信息:
RAM: 16G
JVM heap: 11G
代码使用小数据集提供正确的结果,但是输出数据为10GB时出现内存不足错误。 我认为罪魁祸首是大量的窗函数,因为DAG显示了很长的
序列Window -> WholeStageCodeGen -> Window -> WholeStageCodeGen ...
无论如何以更有效的方式计算相同的功能? 例如,是否可以获得滞后(Sensor1,1),滞后(Sensor2,1),...,滞后(Sensor9,1)而不会将滞后(...,1)调用九次?
如果上一个问题的答案为否,那么我该如何避免内存不足?我已经尝试过增加分区数量。
答案 0 :(得分:1)
您可以尝试类似
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/3.4.0/fabric.min.js"></script>
<canvas id="canvasWorkspaceFamiliogram" width="500" height="470" style="border:1px solid #ccc"></canvas>
也就是说,将所有内容都写在res = res.select('*', lag(s"Sensor$1", 1).over(w), lag(s"Sensor$1", 2).over(w), ...)
中,而不是许多select
然后,计划中将只有1个窗口。也许对性能有帮助。