我在PySpark DataFrame中有时间序列数据。我的每个信号(value
列)都应分配一个唯一的id
。但是id
的值是不精确的,需要扩展到两端。原始的DataFrame看起来像这样:
df_start
+------+----+-------+
| time | id | value |
+------+----+-------+
| 1| 0| 1.0|
| 2| 1| 2.0|
| 3| 1| 2.0|
| 4| 0| 1.0|
| 5| 0| 0.0|
| 6| 0| 1.0|
| 7| 2| 2.0|
| 8| 2| 3.0|
| 9| 2| 2.0|
| 10| 0| 1.0|
| 11| 0| 0.0|
+------+----+-------+
所需的输出是:
df_desired
+------+----+-------+
| time | id | value |
+------+----+-------+
| 1| 1| 1.0|
| 2| 1| 2.0|
| 3| 1| 2.0|
| 4| 1| 1.0|
| 6| 2| 1.0|
| 7| 2| 2.0|
| 8| 2| 3.0|
| 9| 2| 2.0|
| 10| 2| 1.0|
| 11| 2| 1.0|
+------+----+-------+
所以这里发生了两件事:
id
列不够精确:每个id
开始记录a(此处为1和1)的时间步长,并记录b时间(此处为1)。和2)尽早。因此,我必须用各自的ID替换一些零。id
列中的条目之后,我用id=0
删除了所有剩余的行。 (仅适用于带有time=5
的行。)幸运的是,我知道每个ID的相对记录时间延迟是多少。目前,我将其转换为绝对正确的记录时间
df_join
+----+-------+-------+
| id | min_t | max_t |
+----+-------+-------+
| 1| 1| 4|
| 2| 6| 11|
+----+-------+-------+
我用来通过联接“过滤”原始数据
df_desired = df_join.join(df_start,
df_start.time.between(df_join.min_t, df_join.max_t)
)
这将产生所需的输出。
实际上df_join
至少有40万行,df_start
大约有100亿行,其中我们最多。
在集群上运行此命令时,有时会收到诸如Lost task, ExecutorLostFailure, Container marked as failed, Exit code: 134
之类的警告。
我怀疑执行器的内存不足,但是我没有找到任何解决方案。